TCP
- 利用tcp传输协议,写一个客户端,服务端的聊天模式
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/82d5c4be30aad137930b0d6e117a4b05.png)
- 服务端
package se01.day11.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
private ServerSocket server;
private List<PrintWriter> allOut;
public Server() throws Exception{
server = new ServerSocket(8088);
allOut = new ArrayList<PrintWriter>();
}
private synchronized void addOut(PrintWriter pw) {
}
private synchronized void removeOut(PrintWriter pw) {
}
private synchronized void sendMessage(String message) {
for(PrintWriter out : allOut) {
out.println(message);
}
}
public void start() {
try {
System.out.println("等待客户端请求...");
Socket socket = server.accept();
System.out.println("客户端请求,连接成功");
ClientHandler clientHandler = new ClientHandler(socket);
Thread t = new Thread(clientHandler);
t.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Server server = new Server();
server.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务端启动失败...");
}
}
class ClientHandler implements Runnable{
private Socket socket;
private String host;
private String nickName;
public ClientHandler(Socket socket) {
this.socket = socket;
InetAddress address = socket.getInetAddress();
host =address.getHostAddress();
}
@Override
public void run() {
PrintWriter pw = null;
try {
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
nickName = br.readLine();
System.out.println(nickName+"上线了");
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
pw = new PrintWriter(osw,true);
addOut(pw);
String message = null;
while ((message = br.readLine()) != null) {
sendMessage(nickName+"说"+message);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
sendMessage(nickName+"下线了!");
removeOut(pw);
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package se01.day11.chat;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private Socket socket;
public Client()throws Exception{
System.out.println("正在连接服务端");
socket = new Socket("localhost",8088);
System.out.println("成功建立连接");
}
public void start() {
try {
Scanner scan = new Scanner(System.in);
String nickName = null;
while(true) {
System.out.println("请为您起一个昵称");
nickName = scan.next();
if (nickName.length() >0 ) {
break;
}
System.out.println("输入有误");
}
System.out.println("欢迎"+nickName+"登陆,开始聊天吧!");
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw);
pw.println(nickName);
ServerHandler serverHandler = new ServerHandler();
Thread t = new Thread(serverHandler);
t.start();
while(true){
pw.println(scan.next());
pw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Client client = new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("客户端启动失败...");
}
}
class ServerHandler implements Runnable{
@Override
public void run() {
try {
InputStream is= socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8");
BufferedReader br = new BufferedReader(isr);
String message = null;
while ((message = br.readLine()) != null) {
System.out.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}