socket通信是指两台计算机的两个程序之间的通信,双向链路的每一端都称为一个socket,但分为客户机和服务器。
java.net提供了ServerSocket和Socket类,分别用于服务器和客户端。
通信过程:
建立Socket连接,客户端程序申请连接,服务器端程序监听所有端口,判断是否有客户端的服务器请求,当客户端申请某个端口连接时,服务器将对方的ip和端口号绑定形成套接字,这样服务器和客户机就建立了一个专用虚拟连接,可以相互通信了,通信结束后将虚拟连接拆除。
编程步骤:服务器先建立一个服务器套接字ServerSocket,并指定端口号监听客户机请求,然后建立一个Socket用来和客户机通信,客户机建立端建立同一端口的Socket以便和服务器通信。
java.net包含以上两个类:
主要方法说明:
ServerSocket(int port)在指定端口上创建服务器Socket对象
ServerSocket(int port,int count)count 为最大连接数
Sorket(InetAddress IP,int port)使用指定IP和端口建立Socket对象
Sorket(String host,int port)使用指定主机和端口建立Socket对象
以上两个方法有对三个选项 boolean stream(布尔值表示是否选用流式通信)
可以用Socket类的 getInputstream 和getOutstream来读写数据的输入输出流。但要进行异常处理,读取输入输出流后要建立更容易操作的InputStreamReader和Out..... 通信结束后close(Socket)断开连接。
Socket应用:
服务器:
package Socket;
import java.io.*;
import java.net.*;
public class Serverclass{
public static final int SERVERPORT = 9999; //服务器端口号
public static void main(String[] args ){
try{
ServerSocket s = new ServerSocket(SERVERPORT);
System.out.println("开始:" + s); //建立服务器端监听套接字
Socket incoming = s.accept( );//等待并接收请求,建立连接套接字
System.out.println("连接并接收到:" + incoming);//收到连接请求,incoming为套接字端口
BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
//新建网络连接输入流,读取incoming端口传来的信息,为一个对象,传入数据的格式,通过in.readline()翻译
PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(incoming.getOutputStream())), true);
//新建自动刷新的网络输出流,作用:通过out.println()向客户端输出信息。
System.out.println( "输入quit退出" );
while (true){
String line = in.readLine(); //按行读取socket输入
if (line == null) break;
else{
if (line.trim().equals("quit")){
System.out.println("客户端输入了quit!");
System.out.println("连接已经关闭!");
break; }
System.out.println("客户端输入的是:" + line);
out.println("您输入的是:" + line);}}
incoming.close();}
catch (IOException e){ //异常处理
System.err.println("输入输出异常"+e.getMessage());}
}
}
客户端:
package S;
import java.io.*;
import java.net.*;
public class server {
public static final int PORT=9999;
public static void main(String args[]){
try{
Socket s=new Socket("localhost",PORT);//建立连接套接字
System.out.println("socket"+s);//输出端口信息
//新建网络连接输入流
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
//自动刷新的网络连接输出流
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(
s.getOutputStream())),true);
//构造stdin
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入一个字符串,quit退出");
while(true){
//先对如系统输入,在通过套接字输出,out为PrintWriter对象
out.println(stdin.readLine());//out的参数为BufferedWriter类,stdin。readline()
String str=in.readLine();
if(str==null)
break;
System.out.println(str);
}
s.close();
}
catch(IOException e){
System.err.println("错误:"+e.getMessage() );
}
}
}
来源:https://www.cnblogs.com/hitxx/p/4511636.html