本代码实现的是类似聊天室的效果
主文件:
MyServerSocket.java
package mypackage;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class MyServerSocket {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ServerListener().start();//开启监听器,监听器,ServerListener继承于Thread类
}
}
ServerListener.java:
package mypackage;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class ServerListener extends Thread{
public void run(){
try {
ServerSocket serverSocket=new ServerSocket(12345);//创建ServerSocket,使用12345端口
while(true){
Socket socket=serverSocket.accept();//程序运行到此句时阻塞,知道接收到一个socket
JOptionPane.showMessageDialog(null,"有客户端连接到端口12345");
ChatSocket chatsocket=new ChatSocket(socket);//创建一个聊天用的socket
chatsocket.start();//开启线程,接收用户输入的信息
ChatManager.getChatManager().add(chatsocket);//将创建完毕的socket添加到ChatSocket管理器中
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ChatSocket.java
package mypackage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
public class ChatSocket extends Thread {
Socket socket;
public ChatSocket(Socket socket){
this.socket=socket;
}
public void out(String out){ //显示接收到的信息
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){ //接收客户端输入的信息
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
String line=null;
while((line=br.readLine())!=null){
ChatManager.getChatManager().publish(this, line);//发送给所有人
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ChatManager.java:
package mypackage;
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){
vector.add(cs);
}
public void publish(ChatSocket cs,String out){ //将信息打印给Vector中的所有socket
for(int i=0;i<vector.size();i++){
ChatSocket csChatSocket=vector.get(i);
if(!cs.equals(csChatSocket)){
csChatSocket.out(out);
}
}
}
}
在win下,运行程序后,打开终端:
输入:telnet localhost 12345 即可发送一个socket给12345端口,
然后重复创建。在任何一个终端中输入信息,其他窗口也会出现同样的信息。