进击的猿
2017-04-09 23:46
那个,我想做一个简单的通信,我用了多线程,但是我输入一句话然后点击回车,然后服务器没有输出这句话,直到我输入结束标志over然后才打印,然后是把全部的打印出来,请问怎么解决
//服务器端 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(); } }
非常感谢啊
服务器端: 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) {} } } } 欢迎交流,谢谢。
run方法里不是死循环吗 我怎么有点不懂·
Java Socket应用---通信是这样练成的
125012 学习 · 590 问题
相似问题