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();
}
}
}
运行程序时先运行服务器端程序,在运行客户端。多个客户端之间可以实现简易的多人聊天功能。

浙公网安备 33010602011771号