1.客户端
package cn.breeziness.net.tcp;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* Description:TCP双向聊天室的实现,使用多线程实现收发分离,可同时收发
* Author: breeziness
*/
public class ChatClient02 {
private static boolean isRunning = true;
public static void main(String[] args) {
Socket socket = null;
System.out.println("------client------");
try {
socket = new Socket(InetAddress.getLocalHost(), 9999);
new Thread(new ReceiveThread(socket)).start();
new Thread(new SendThread(socket)).start();
} catch (IOException e) {
//e.printStackTrace();
System.out.println("创建socket出错");
}
}
}
2.服务端
package cn.breeziness.net.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 网络编程:Tcp聊天室的实现
* 发送和接收使用多线程分离,互不干扰
* 服务器端
*/
public class ChatServce02 {
private static boolean isRunning = true;
public static void main(String[] args) {
System.out.println("------server--------");
ServerSocket serverSocket = null;
Socket client = null;
try {
serverSocket = new ServerSocket(9999);//服务器接收端口9999
client = serverSocket.accept();//服务器阻塞等待连接
System.out.println("一个客户端已经连接,端口号:" + client.getPort());
new Thread(new ReceiveThread(client)).start();//接收线程
new Thread(new SendThread(client)).start();//发送线程
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.发送线程
package cn.breeziness.net.tcp;
import java.io.*;
import java.net.Socket;
/**
* Description:
* Author: Breeziness
*/
public class SendThread implements Runnable {
private Socket socket = null ;
private BufferedWriter out = null;
private BufferedReader console = null;
private boolean isRunning = true;
public SendThread(Socket socket) {
this.socket = socket;
try {
out = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream()));
console = new BufferedReader(new InputStreamReader(System.in));
} catch (IOException e) {
//e.printStackTrace();
System.out.println("建立输出流出错");
}
//ChatUtils.release(out, socket);
}
public void send() {
try {
String msg = console.readLine();
out.write(msg);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//send();
try {
while (isRunning) {
String msg = console.readLine();
out.write(msg+"\n");
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
ChatUtils.release(out,console);
}
}
}
4.接收线程
package cn.breeziness.net.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* Description:
* Author: Breeziness
*/
public class ReceiveThread implements Runnable{
private Socket socket = null;
private BufferedReader in = null;
private boolean isRunning = true;
public ReceiveThread(Socket socket){
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
//e.printStackTrace();
System.out.println("服务器接收端输入流出错");
}
}
public String receive(){
String msg = "";
try {
msg = in.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return msg;
}
@Override
public void run() {
while(isRunning){
//String msg = receive();
String msg = "";
try {
while(isRunning){
msg = in.readLine();
System.out.println(msg);
if(!isRunning) break;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
ChatUtils.release(in);
}
}
}
}
5.工具类
package cn.breeziness.net.tcp;
import java.io.Closeable;
import java.io.IOException;
/**
* Description:
* Author: Breeziness
*/
public class ChatUtils {
public static void release(Closeable... closeables){
for (Closeable closeable:closeables){
try {
if(null !=closeable){
closeable.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
前面忘说了 ,学习于裴新的教学,谢谢裴老师