Solution:
Send and receive messages to two different threads
1. SendThread sends the message thread
2. RecieveThread receives the message Thread
3. Once the Server accepts the connection, it starts two sending and receiving threads
4. Once the Client establishes the connection, it starts two sending and receiving threads
1 SendThread
package socket; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class SendThread extends Thread { private Socket s; public SendThread(Socket s) { this.s = s; } @Override public void run() { try { OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); while(true){ Scanner sc = new Scanner(System.in); String str = sc.next(); dos.writeUTF(str); } } catch (IOException e) { e.printStackTrace(); } } }
2 RecieveThread
package socket; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; public class RecieveThread extends Thread { private Socket s; public RecieveThread(Socket s) { this.s = s; } @Override public void run() { InputStream is = null; try { is = s.getInputStream(); DataInputStream dis = new DataInputStream(is); while(true){ String msg = dis.readUTF(); System.out.println(msg); } } catch (IOException e) { e.printStackTrace(); } } }
3 Server
package socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8888); System.out.println("监听端口号:8888"); Socket s = ss.accept(); new SendThread(s).start(); new RecieveThread(s).start(); } catch (IOException e) { e.printStackTrace(); } } }
4 Client
package socket; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8888); new SendThread(s).start(); new RecieveThread(s).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Server
package socket; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.JTextField; public class GUIServer { public static void main(String[] args) throws Exception { JFrame f = new JFrame(); f.setTitle("server"); f.setSize(400, 300); f.setLocation(100, 200); f.setLayout(null); JButton b = new JButton("send"); b.setBounds(10, 10, 80, 30); f.add(b); final JTextField tf = new JTextField(); tf.setBounds(10, 110, 80, 30); f.add(tf); final JTextArea ta = new JTextArea(); ta.setBounds(110,10, 200, 300); f.add(ta); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); ServerSocket ss = new ServerSocket(8888); System.out.println("listenning on port:8888"); final Socket s = ss.accept(); new Thread() { public void run() { while (true) { try { DataInputStream dis = new DataInputStream( s.getInputStream()); String text = dis.readUTF(); ta.append(text+"\r\n"); } catch (Exception e) { e.printStackTrace(); } } } }.start(); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String text = tf.getText(); ta.append(text+"\r\n"); try { DataOutputStream dos = new DataOutputStream( s.getOutputStream()); dos.writeUTF(text); } catch (Exception ex) { ex.printStackTrace(); } } }); } }
Client
package socket; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.JTextField; public class GUIClient { public static void main(String[] args) throws Exception { JFrame f = new JFrame(); f.setTitle("client"); f.setSize(400, 300); f.setLocation(600, 200); f.setLayout(null); JButton b = new JButton("send"); b.setBounds(10, 10, 80, 30); f.add(b); final JTextField tf = new JTextField(); tf.setBounds(10, 110, 80, 30); f.add(tf); final JTextArea ta = new JTextArea(); ta.setBounds(110,10, 200, 300); f.add(ta); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); final Socket s = new Socket("127.0.0.1", 8888); new Thread() { public void run() { while (true) { try { DataInputStream dis = new DataInputStream( s.getInputStream()); String text = dis.readUTF(); ta.append(text+"\r\n"); } catch (Exception e) { e.printStackTrace(); } } } }.start(); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String text = tf.getText(); ta.append(text+"\r\n"); try { DataOutputStream dos = new DataOutputStream( s.getOutputStream()); dos.writeUTF(text); } catch (Exception ex) { ex.printStackTrace(); } } }); } }
The above is the detailed content of Java network programming: implementation of multi-threaded chat. For more information, please follow other related articles on the PHP Chinese website!