(平时操作,留下痕迹,以后效,君若受益,吾之大幸)
*编写完服务器,可打开终端进行测试 打开cmd 命令 键入 telnet localhost +(端口号)
例如:
回车 便与服务器端口建立连接
一、MyServerSocket.class
package cn.upc.serversocket.main;
public class MyServerSocket {
public static void main(String[] args) {
new ServerSocketListener().start();
System.out.println(1);
}
}
二、ServerSocketListener.class
package cn.upc.serversocket.main;
import javax.swing.*;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketListener extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(12345); //1~65535
while (true) {
Socket socket = serverSocket.accept(); //监听连接,建立连接,返回socket对象
//JOptionPane.showMessageDialog(null, "客户端已经连接到12345端口");
ChatSocket cs = new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs); //添加至聊天管理器
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、ChatSocket.class
package cn.upc.serversocket.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ChatSocket extends Thread {
Socket socket;
public ChatSocket(Socket socket) {
this.socket = socket;
}
public void out(String string) { //ServerSocket发送数据功能 客户端接收
try {
socket.getOutputStream().write((string+"\n").getBytes("GBK"));
} catch (IOException e) {
ChatManager.getChatManager().remove(this);
}
}
@Override
public void run() {
try {
BufferedReader br = //ServerSocket接受数据功能
new BufferedReader(
new InputStreamReader(
socket.getInputStream(), "GBK"));
String line = null;
while ((line = br.readLine()) != null) {
ChatManager.getChatManager().publish(this, line); //向各个客户端发送数据
}
br.close();
} catch (IOException e) {
System.out.println("断开了一个客户端链接");
ChatManager.getChatManager().remove(this);
}
}
}
四、ChatManager.class
package cn.upc.serversocket.main;
import java.util.Vector;
public class ChatManager {
private ChatManager(){} //单例化
private static final ChatManager cm= new ChatManager();
public static ChatManager getChatManager(){
return cm;
}
Vector<ChatSocket> vector=new Vector<ChatSocket>();
public void add(ChatSocket cs){ //为集合添加socket对象
vector.add(cs);
}
public void remove(ChatSocket cs){
vector.remove(cs);
}
public void publish(ChatSocket cs,String string){ //某一线程 向其他线程发布信息
for (int i = 0; i < vector.size(); i++) {
ChatSocket chatSocket=vector.get(i);
if(!cs.equals(chatSocket)){
chatSocket.out(string);
}
}
}
}