java中的socket通信

来源:互联网 发布:java rmi属于哪类漏洞 编辑:程序博客网 时间:2024/06/05 12:40

本代码实现的是类似聊天室的效果

主文件:

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 stubnew 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();//程序运行到此句时阻塞,知道接收到一个socketJOptionPane.showMessageDialog(null,"有客户端连接到端口12345");                                ChatSocket chatsocket=new ChatSocket(socket);//创建一个聊天用的socketchatsocket.start();//开启线程,接收用户输入的信息ChatManager.getChatManager().add(chatsocket);//将创建完毕的socket添加到ChatSocket管理器中}} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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中的所有socketfor(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端口,

然后重复创建。在任何一个终端中输入信息,其他窗口也会出现同样的信息。

0 0
原创粉丝点击