Java网络编程实现多线程聊天

网友投稿 285 2022-10-14


Java网络编程实现多线程聊天

本文实例为大家分享了java网络编程实现多线程聊天的具体代码,供大家参考,具体内容如下

聊天程序如果是单线程,会导致没人只能说一句,并且说了以后,必须等到另一个人的回复,才能说第二句。收发都在主线程中,不能同时进行。

解决方法:

将收发放到两个不同的线程

1. SendThread 发送消息线程

2. RecieveThread 接受消息线程

3. Server一旦接受到连接,就启动收发两个线程

4. Client 一旦建立了连接,就启动收发两个线程

多线程聊天

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 RecieveThreadfCaiZC 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);

http:// 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();

}

}

});

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分布式可视化坐席管理协作系是集矩阵拼接控制传输KVM 于一体的系统GEFFEN格芬科技
下一篇:展锐助力中兴通讯发布5G工业模组ZM9010,使能行业客户数智未来
相关文章

 发表评论

暂时没有评论,来抢沙发吧~