TCP:聊天室之服务器端---开启通信通道
public class Server {
//创建一个存储客户端的集合
public static List<MyChannel> list = new ArrayList<MyChannel>();
public static void main(String[] args) {
System.out.println("------------服务器端已开启------------");
try {
ServerSocket server = new ServerSocket(9999);
while(true) {
//监听客户端连接
Socket socket = server.accept();
//构建转发线程对象
MyChannel channel = new MyChannel(socket);
//将连接服务器的客户端加入集合
list.add(channel);
//启动线程
new Thread(channel).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MyChannel implements Runnable{
private DataInputStream dis;
private DataOutputStream dos;
private boolean flag = true;
public MyChannel(Socket socket) {
try {
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dis, dos, socket);
Server.list.remove(this);
}
}
/*
* 接收数据的方法
*/
public String receive() {
String str = "";
try {
str = dis.readUTF();
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dis, dos);
Server.list.remove(this);
}
return str;
}
/*
* 发送数据的方法
*/
public void send(String str) {
if(str != null && str != "") {
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e) {
flag = false;
CloseUtil.closeAll(dis, dos);
Server.list.remove(this);
}
}
}
/*
* 转发数据的方法
*/
public void sendOthers() {
String str = receive();
List<MyChannel> list = Server.list;
for (MyChannel myChannel : list) {
if(myChannel == this) {
continue;//不给自己转发
}
myChannel.send(str);//转发给每个客户端
}
}
@Override
public void run() {
while(flag) {
sendOthers();
}
}
}
class CloseUtil {
public static void closeAll(Closeable...ables) {
for (Closeable closeable : ables) {
try {
if(closeable != null)
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP:聊天室之客户端
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 java.net.UnknownHostException;
public class ChatClient {
public static void main(String[] args) {
Socket socket = null;
BufferedReader in = null;
try {
socket = new Socket("localhost", 9999);
//创建向服务器端发送信息的想成并启动
new ClientThread(socket).start();
in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while(true) {
System.out.println("服务器说:"+in.readLine());
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(in != null)
in.close();
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 用于向服务器端发送信息
*/
class ClientThread extends Thread{
private Socket socket;
private BufferedWriter out;
private BufferedReader br;
public ClientThread(Socket socket) {
this.socket = socket;
try {
out = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
br = new BufferedReader(
new InputStreamReader(System.in));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true) {
String str = br.readLine();
out.write(str + "n");
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(br != null)
br.close();
if(out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
尚学堂百战程序员
百战程序员_IT6000集_影响6000万学习IT的中国人【官网】