实现网络聊天室:
需要的类:
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);
}
}
}
- 附上运行结果:先启动服务器,再启动客户端; 由于受到设备的限制,多启动击此客户端模拟成多人聊天。