Socket通信
1、TCP协议是面相连接、可靠地、有序的,以字节流的方式发送数据
2、基于TCP协议实现网络通信的类:客户端的Socket类,服务器端的ServerSocket类
Socket通信实现步骤
1、创建ServerSocket和Socket
2、打开连接到Socket的输入/输出流
3、按照协议对Socket进行读/写操作
4、关闭输入输出流、关闭Socket
ServerSocket常用的方法
1、常用构造方法:ServerSocket(int port)//创建绑定到特点端口的服务器套接字
2、Socket accept()//侦听并接受到此套接字的连接,调用会阻塞该端口并等待连接
3、close()//关闭此套接字
4、InetAddress getInetAddress()//返回次服务器套接字的本地地址
5、int getLocalPort()//返回该套接字的端口号
Socket常用的方法
1、构造方法:Socket(InetAddress address,int port)//指定IP和端口号创建Socket
Socket(String host,int port)//指定主机上的指定端口号创建Socket
2、close():关闭此套接字
3、InetAddress getInetAddress()//返回套接字连接的地址
4、InputStream getInputStream()//返回此套接字的输入流
shutdownInput()//关闭输入流
OutputStream getOutputStream()//返回此套接字的输出流
shutdownOutput()//关闭输出流
服务器端:
1.创建ServerSocket对象,绑定监听端口
2.accept()方法监听客户端请求
3.建立连接后,通过输入流读取客户端发送信息
4.通过输出流向客户端发送响应信息
5.关闭相关资源
客户端:
1.创建Socket对象,指明需要连接的服务器的地址和端口号
2.连接建立后,通过输出流 服务器端发送请求信息
3.通过输入流获取服务器响应的信息
4.关闭相关资源
服务器端:
//1.创建一个serverSocket,绑定监听端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.调accept()方法开始监听,等待客户端连接
System.out.println("***服务器即将启动,等待连接***");
Socket socket = serverSocket.accept();
//3.获取输入流,用来读取客户端发送的信息
InputStream is=socket.getInputStream();//字节输入流
InputStreamReader ir = new InputStreamReader(is);//将字节流转为字符流
BufferedReader br = new BufferedReader(ir);//为输入流添加缓冲
String data = br.readLine();
while(data!=null){
System.out.println("我是服务器,客户端说:" + data);
data = br.readLine();
}
socket.shutdownInput(); //注意:关闭输入流,否则会造成阻塞。
//创建输出流,响应客户端请求
OutputStream out=socket.getOutputStream();
//将输出流转为打印流
PrintWriter pw=new PrintWriter(out);
pw.write("欢迎您~~~");
pw.flush();//调用flush()方法将缓冲输出
socket.shutdownOutput();//关闭socket输出流
//关闭资源
br.close();
ir.close();
is.close();
socket.close();
serverSocket.close();
客户端:
//1.创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost", 8888);
//2.获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:alice;密码:789");
pw.flush();
socket.shutdownOutput();//注意:关闭输出流
//3.获取输入流,并读取服务器端的响应信息
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务器说:"+info);
}
socket.shutdownInput();//注意:关闭输入流
//4.关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
Ps1:小技巧:点击蓝色电脑可以切换不同类的控制台。
Ps2:服务端要优先于客户端启动,等待命令的传输。
多线程服务器:
应用多线程来实现服务器与多客户端之间的通信
基本步骤:
1、服务器端创建ServerSocket,循环调用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端连接
3、服务器端接受客户端的请求,创建socket与客户端建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务器端继续等待新的连接
ServerSocket常用方法:
ServerSocket(int port)——创建并绑定到特定端口的服务器套接字
accept()——侦听并接受到此套接字的连接
close()——关闭此套接字
getInetAddress()——得到ServerSocket对象绑定的IP地址。如果ServerSocket对象未绑定IP地址,返回0.0.0.0。
getLocalPort()——返回此套接字在其上侦听的端口
Socket常用方法:
Socket(InetAddress address, int port)——创建一个套接字并将其连接到指定ip地址的指定端口号
Socket(String host, int port)——创建一个套接字并将其连接到指定主机上的指定端口号
close()——关闭此套接字
getInetAddress()——返回套接字连接的地址
getInputStream()——返回此套接字的输入流
getOutputStream——返回此套接字的输出流服务器线程处理类:
public class ServerThread extends Thread {
// 和本线程相关的Socket
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
//线程执行的操作,响应客户端的请求
public void run(){
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os=null;
PrintWriter pw=null;
try {
//获取输入流,并读取客户端信息
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取客户端的信息
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();//调用flush()方法将缓冲输出
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭资源
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器端:
//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null;
//记录客户端的数量
int count=0;
System.out.println("***服务器即将启动,等待客户端的连接***");
//循环监听等待客户端的连接
while(true){
//调用accept()方法开始监听,等待客户端的连接
socket=serverSocket.accept();
//创建一个新的线程
ServerThread serverThread=new ServerThread(socket);
//启动线程
serverThread.start();
count++;//统计客户端的数量
System.out.println("客户端的数量:"+count);
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());