利用网络 Socket 和多线程实现一个双向聊天

本贴最后更新于 2491 天前,其中的信息可能已经水流花落

接收键盘输入然后向对方发送消息的线程

package cn.com.chat;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * 
 * @author Xiaofei
 *
 */
public class SendMsgThread extends Thread{
	/**
	 * 用来接收键盘输入然后向对方发送消息的线程
	 */
	Socket ss = null;
	BufferedWriter bw = null;
	BufferedReader br = null;
	public SendMsgThread(Socket ss){
		this.ss = ss;
		try {
			bw = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));
			br = new BufferedReader(new InputStreamReader(System.in));
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
	public void run(){
			try {
				while(true){
					String str;
					str = br.readLine();
					if(str.equals("exit")){
						System.exit(0);
					}else{
						bw.write(str+"\n");
						bw.flush();
					}
				}
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}finally{
				try {
					bw.close();
					br.close();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
		}
}

服务端:Server

package cn.com.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		BufferedReader br= null;
		try {
			server = new ServerSocket(88);
			socket = server.accept();
			new SendMsgThread(socket).start();
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			while(true){
				String str = br.readLine();
				System.out.println("客户端:\n"+str);
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}finally{
			try {
				br.close();
				server.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}

}

客户端:Client

package cn.com.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		try {
			socket = new Socket("192.168.16.111", 88);
			System.out.println("请输入您的消息:");
			new SendMsgThread(socket).start();
			br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			while (true) {
				String str = br.readLine();
				System.out.println("客户端:\n" + str);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
				socket.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}

}

特别提醒一点:注意启动的顺序,先启动服务端,再启动客户端。现有接收的服务器,客户端才能够获得服务端的端口和 IP。

  • Socket
    20 引用 • 23 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone756

    呦,Java 高级.不错.

  • someone

    哈哈,这是以前在学校做的代码,毕业后就没有接触过JAVA 网络这方面的东西了,已经忘记的差不多了。:joy: :joy: :joy: :joy: