为了账号安全,请及时绑定邮箱和手机立即绑定

大家有简单的聊天室的代码我参考一下吗

那个,我想做一个简单的通信,我用了多线程,但是我输入一句话然后点击回车,然后服务器没有输出这句话,直到我输入结束标志over然后才打印,然后是把全部的打印出来,请问怎么解决

正在回答

4 回答

//服务器端
package Main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TCPServer {

	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8899);
		Socket socket = server.accept();
		System.out.println("链接成功。");
		Speak speak = new Speak(socket);
		speak.start();
		Listen listen = new Listen(socket);
		listen.start();
	}

}

class Speak extends Thread {
	Socket socket = null;
	PrintWriter speak = null;
	String Data = null;
	Scanner hand = new Scanner(System.in);
	
	public Speak(Socket socket) throws IOException {
		this.socket = socket;
		this.speak = new PrintWriter(socket.getOutputStream(), true);
	}
	
	public void run(){
		while(true){
			Data = hand.next();
			speak.println(Data);					
		}
	}	
}

class Listen extends Thread {
	Socket socket = null;
	BufferedReader reader = null;
	
	public Listen(Socket socket) throws IOException{
		this.socket = socket;
		this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}
	
	public void run(){
		while(true){
			try {
				System.out.println(reader.readLine());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}



//客户端
package Main;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		Socket socket = new Socket("127.0.0.1", 8899);
		System.out.println("链接成功。。");
		Speak speak = new Speak(socket);
		speak.start();
		Listen listen = new Listen(socket);
		listen.start();
	}

}


0 回复 有任何疑惑可以回复我~
#1

进击的猿 提问者

非常感谢!你的代码很清晰,我看懂了
2017-05-07 回复 有任何疑惑可以回复我~

非常感谢啊

0 回复 有任何疑惑可以回复我~
服务器端:
package QiYanhui;
import java.net.*;
import java.io.*;
import java.util.*;

/**
 * @author 聊天软件的服务器端程序
 */
public class TalkServer {
    public static ArrayList<Client> allclient = new ArrayList<Client>(); //存放所有通信线程
    public static int clientnum = 0;  //统计客户连接的计数变量
    
    public static void main(String args[]){
        try {
            ServerSocket s = new ServerSocket(5432);
            while(true){
                Socket s1 = s.accept();  //等待客户连接
                DataOutputStream dos = new DataOutputStream(s1.getOutputStream());
                DataInputStream din = new DataInputStream(s1.getInputStream());
                Client x = new Client(clientnum, dos, din);  //创建与客户对应的通信线程
                allclient.add(x);  //将线程加入ArrayList中
                x.start();
                clientnum++;
            }
        } catch (IOException e) { }
    }
}

//通信线程处理与对应的客户通信,将来自客户数据发往其他客户
class Client extends Thread {
    int id;   //客户的标识
    DataOutputStream dos;  //去往客户的输出流
    DataInputStream din;  //来自客户的输入流
    
    public Client(int id, DataOutputStream dos, DataInputStream din){
        this.id = id;
        this.dos = dos;
        this.din = din;
    }
    
    public void run(){    //循环读取客户数据转发给其他客户
        while(true){
            try {
                String message = "客户" + id + ":" + din.readUTF();   //读客户数据
                for(int i=0; i<TalkServer.clientnum; i++){
                    //将消息转发给其他客户
                    if(i != id){
                        TalkServer.allclient.get(i).dos.writeUTF(message);
                    }else{
                        String remessage = "";
                        remessage = message.replace("客户" + id, "自己");
                        
                        //使自己发送的信息显示在屏幕的右边
                        int aa = 35 - remessage.length();
                        StringBuffer space= new StringBuffer();
                        //输出指定的空格
                        for(int j= 0;j<(aa-1);j++)
                        {
                           space.append(" ");//这里是空格
                        }
                        TalkServer.allclient.get(id).dos.writeUTF((space.toString()) + remessage);
                    }
                }
            } catch (IOException e) {}
        }
    }
}


客户端:
package QiYanhui;
import java.net.*;
import java.io.*;
import java.awt.event.*;
import java.awt.*;

public class TalkClient {
    public static void main(String[] args) throws IOException{
        Socket s1 = new Socket("localhost", 5432);    //连接服务器
        DataInputStream dis = new DataInputStream(s1.getInputStream());
        final DataOutputStream dos = new DataOutputStream(s1.getOutputStream());
        Frame myframe = new Frame("简易聊天室");
        Panel panelx = new Panel();
        final TextField input = new TextField(35);
        TextArea display = new TextArea(19, 35);
        panelx.add(display);
        panelx.add(input);
        myframe.add(panelx);
        new receiveThread(dis, display);    //创建启动接收消息的线程
        input.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    dos.writeUTF(input.getText());    //发送数据
                    input.setText("");  //清空输入框内容
                } catch (IOException e2) {    }
            }
        });
        
        myframe.setSize(350, 400);
        myframe.setVisible(true);
    }
}

//接收消息线程循环读取网络消息,显示在文本域
class receiveThread extends Thread{
    DataInputStream dis;
    TextArea displayarea;
    
    public receiveThread(DataInputStream dis, TextArea m){
        this.dis = dis;
        displayarea = m;
        this.start();
    }
    
    public void run(){
        for(;;){
            try {
                String str = dis.readUTF();   //读来自服务器的消息
                displayarea.append(str + "\n");   //将消息添加到文本域显示
            } catch (IOException e) {}
        }
    }
}


欢迎交流,谢谢。


0 回复 有任何疑惑可以回复我~

run方法里不是死循环吗 我怎么有点不懂·

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

大家有简单的聊天室的代码我参考一下吗

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信