Socket 编程入门
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
服务器端使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。举一个简单的例子
服务器端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; public class Sever { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(20001);//创建一个SeverSocket对象 //服务器端的程序循环运行 while(true){ Socket s = ss.accept();//接收到客户端的Socket PrintStream ps = new PrintStream(s.getOutputStream());//用于先客户端写信息 BufferedReader sin = new BufferedReader(new InputStreamReader(s.getInputStream()));//接收客户端信息 String read = null; read = sin.readLine(); System.out.println("收到客户端信息:"+ read); ps.println("收到客户端请求"); }
客户端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import java.io.InputStreamReader; public class Client { /** * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1",20001);//创建客户端对象,指定端口号 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //用于接收服务器信息 PrintStream ps = new PrintStream(socket.getOutputStream()); //用于向服务器发送信息 String read = null; ps.println("向服务器发送信息"); read = br.readLine(); System.out.println("收到服务器信息:" +read); ps.close(); br.close(); socket.close(); } }
以上程序中客户程序运行一次就向服务器发送文字“向服务器发送信息”,并在控制台显示服务器发送过来的文字,服务器端也进行相同的操作
上面的程序中客户端执行一次就退出,服务器端循环执行监听客户端。
以下是升级版,实现简易的多人聊天室功能。服务器负责监听各个客户端的文字并显示给客户端。
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class CS_S { /** * @param args */ public static ArrayList<Socket> socketlist = new ArrayList<Socket>(); //定义一个ArrayList来接收各个客户端的socket public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(30000); while(true){ Socket s = ss.accept(); socketlist.add(s);//将socket加入arraylist new Thread(new CS_SThread(s)).start();//在线程中执行监听 } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.PrintStream; import java.io.InputStreamReader; import java.net.Socket; public class CS_SThread implements Runnable{ /** * @param args */ Socket socket = null; BufferedReader br = null; //定义一个构造函数,接收出入的socket public CS_SThread(Socket s ) throws IOException{ this.socket = s; br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } @Override public void run() { String content = null; while((content=readfromclient())!=null){ //在循环中向每一个客户端的socket中写入信息 for(Socket s : CS_S.socketlist){ try { PrintStream ps = new PrintStream(s.getOutputStream()); //写信息 ps.println(content); } catch (IOException e) { e.printStackTrace(); } } } } //读取socket中的内容 private String readfromclient(){ try { return br.readLine(); } catch (IOException e) { //如果报错就把该socket从arraylist中移除 CS_S.socketlist.remove(socket); e.printStackTrace(); } return null; } }
客户端代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; public class CS_C { /** * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket s = new Socket("127.0.0.1",30000); new Thread(new CS_CThread(s)).start();//起一个线程负责接收服务器发过来的信息 PrintStream ps = new PrintStream(s.getOutputStream()); //将客户端写在控制台的信息发送给服务器 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String content = null; while((content=br.readLine())!=null){ ps.println(content); } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class CS_CThread implements Runnable{ Socket s = null; BufferedReader br = null; //构造函数,传入socket public CS_CThread(Socket s) throws IOException{ this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run() { String content = null; try { while((content=br.readLine())!=null){ //输出信息 System.out.println(content); } } catch (IOException e) { e.printStackTrace(); } } }
运行程序时先运行服务器端程序,在运行客户端。多个客户端之间可以实现简易的多人聊天功能。