Java网络聊天室TCP模式

实现网络聊天室:
需要的类:
	TcpServer	服务器
	TcpClient	客户端
	SeverThread	服务器转发线程
	WriterThread	客户端发送线程
	ReaderThread	客户端接收线程
用到的技术:
	网络编程
	IO流
	多线程
  • 先来了解什么是TCP模式?

      Tcp编程:通讯模式---客户端/服务器
      是一种通信规则,就是数据的传输规则
      建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低,例如:打电话
    
  • 说到这就不得不说下UDP模式。

    将数据源和目的封装到数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快:例如发短信
    
  • TCP、UDP都是传输层的协议

  • TcpServer
package com.hym.tcpChat;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class TcpServer {
	public static List<ServerThread> list = new ArrayList<>();
	public static void main(String[] args) {
		//服务器
		try {
			ServerSocket server = new ServerSocket(7777);
			System.out.println("端口7777开始监听...");
			//阻塞接收客户端
			while(true){
				Socket socket = server.accept();
				System.out.println("一个客户端连接上来了...");
				ServerThread st = new ServerThread(socket); 
				list.add(st);
				st.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

TcpClient

package com.hym.tcpChat;

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

public class TcpClient {
	
	//客户端
	public static void main(String[] args) {
		try {
			Socket socket= new Socket("127.0.0.1",7777);
		
			new WriterThread(socket).start();
			new ReaderThread(socket).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

WriterThread

package com.hym.tcpChat;

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

import com.hym.utils.CloseUtils;

public class WriterThread extends Thread {
	private Socket socket;
	private BufferedWriter bw;
	private BufferedReader br;
	public WriterThread(Socket socket) {
		try {
			bw = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));
			br = new BufferedReader(new InputStreamReader(System.in));
			this.socket = socket;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		System.out.print("请输入昵称: ");
		try {
			while (true) {
				String msg;
				msg = br.readLine().trim();
				bw.write(msg);
				bw.newLine();
				bw.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			CloseUtils.closeAll(br, bw, socket);
		}

	}
}

ServerThread

package com.hym.tcpChat;

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

import com.hym.utils.CloseUtils;

public class WriterThread extends Thread {
	private Socket socket;
	private BufferedWriter bw;
	private BufferedReader br;
	public WriterThread(Socket socket) {
		try {
			bw = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));
			br = new BufferedReader(new InputStreamReader(System.in));
			this.socket = socket;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		System.out.print("请输入昵称: ");
		try {
			while (true) {
				String msg;
				msg = br.readLine().trim();
				bw.write(msg);
				bw.newLine();
				bw.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			CloseUtils.closeAll(br, bw, socket);
		}

	}
}

ReaderThread

package com.hym.tcpChat;

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

import com.hym.utils.CloseUtils;

public class ReaderThread extends Thread{
	
	private Socket socket;
	private BufferedReader br;
	public ReaderThread(Socket socket) {
		try {
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			this.socket = socket;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		try {
			while(true){
				String msg = br.readLine();
				System.out.println(msg);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			CloseUtils.closeAll(br,socket);
		}
	}
}
  • 附上运行结果:先启动服务器,再启动客户端; 由于受到设备的限制,多启动击此客户端模拟成多人聊天。
    在这里插入图片描述
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值