1.所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄
2.应用程序通常通过“套接字”向网络发送请求或者应答网络请求
3.Socket有两种主要的操作方式:面向连接(TCP)的和无连接的(UDP)。
4.Java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上。
ServerSocket:这个类是实现了一个服务器端的Socket,利用这个类可以监听来自网络的请求(当要监控多个客户端时,可使用类ExecutorService,其对象获取方法:Executors.newCachedThreadPool(); 调用该对象的execute(Runnablecommand)即可,在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由Executor实现决定)。创建一个ServerSocket必须指定一个端口,以便客户端能够向该端口号发送连接请求。其accept()方法为下一个传入的连接请求创建Socket实例。
Socket:利用Socket构造函数,可创建一个TCP套接字后,先连接到指定的远程地址和端口号。
通信过程中顺序:服务器端首先得到输入流,然后将输入流信息输出到其各个客户端
Socket提供了getInputStream()和getOutputStream()方法来得到输入输出流。然后再对输入流输出流进行读写操作,例 如,对于服务器端,得到Socket对象后,调用getInputStream方法即 可得到来自客户端的流,调用getOutStream方法可得到向客 户端发送数据的流。对于客户端,调用getInputStream方法即可得到来自服务器的流,调用getOutStream方法可得到向服务器端发送 数 据的流。下面是一个简单的例子:
public class SocketClient {
public static void main(String [] args){
Socket socket=null;
BufferedReader reader=null;
PrintWriter writer=null;
try {
//客户端socket指定服务器的地址和端口号
socket=new Socket("127.0.0.1", SingleSocketService.port);
//获取服务端的输入流
reader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
//用于发送返回信息,
writer =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
for (int i = 0; i < 10; i++) {
writer.println("body" + i);
writer.flush();
String str=reader.readLine();
System.out.println(str);
}
writer.println("end");
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class SingleSocketService {
public static int port =8080;
public static void main(String [] agres){
ServerSocket serverSocket = null;
BufferedReader bufferedReader = null;
PrintWriter writer = null;
Socket socket = null;
//设定服务端的端口号
try {
serverSocket=new ServerSocket(port);
等待请求,此方法会一直阻塞,直到获得请求才往下走
socket=serverSocket.accept();
//用于接收客户端发来的请求,得到输入流
bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法
writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
while (true){
String str=bufferedReader.readLine();//接收到的信息
if(str.equals("end")){
break;
}
Thread.sleep(1000);
writer.println("Message Received");
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
writer.close();
socket.close();
serverSocket.close();
}catch (Exception e){
}
}
}