基于Tcp的Socket通信原理
Java socket通信通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。socket 开发分客户端与服务端,服务端ServerSocket开启服务监听某一端口,客户端socket向此服务器的这个端口发出请求,成功则会建立会话,形成通道,这个通道若不做其它操作会一直存在,就是所谓的长连接了,这时服务端与客户端可以通过此通道进行即时通信.
通信模型:
服务器端的实现:
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
*
* 服务器端
* 基于TCP协议的Socket通信
*
* */
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建ServerSocket对象,绑定监听端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8880);
// 2.通过accept方法监听客户端请求,等待客户端的连接
Socket socket = socket = serverSocket.accept();
//3.连接建立后,通过输入流读取客户端发送的请求信息
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//转为字符流
BufferedReader br = new BufferedReader(isr);//添加缓冲
String info = null;
while((info = br.readLine())!= null) {
System.out.println("服务器端收到的客户端传来的请求内容为:"+info);
}
//4.通过输出流向客户端发出响应信息
OutputStream os = socket.getOutputStream();
PrintWriter print = new PrintWriter(os);
print.write("欢迎您!");
print.flush();
socket.shutdownOutput();
// 5.关闭相关资源
serverSocket.close();
}
}
客户端的实现
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
*
* 客户端
* 基于TCP协议的Socket通信
*
* */
class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
// 1.创建Socket对象,指明要连接的服务器地址和端口号
Socket socket = new Socket("localhost", 8888);
// 2.连接建立后,通过输出流向服务器端发送请求
OutputStream os = socket.getOutputStream();// 字节输出流
PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
print.write("用户名:admin; 密码:123");
print.flush();
socket.shutdownOutput();
// 3.通过输入流读取服务器端响应的信息
InputStream is = socket.getInputStream();// 字节输入流
InputStreamReader isr = new InputStreamReader(is);// 转为字符流
BufferedReader br = new BufferedReader(isr);// 添加缓冲
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("客户端收到的服务器端传来的响应内容为:" + info);
}
// 4.关闭相关资源
socket.close();
}
}
应用多线程来实现服务器与多线程之间的通信
步骤如下:
1、服务器端创建ServerSocket,循环调用accept()等待客户端链接
2、客户端创建一个Socket并请求和服务器端链接
3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接
4、建立链接的socket在一个单独的线程上对话
5、服务器继续等待新的链接
服务器端多线程的实现
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerThread extends Thread {
Socket socket = null;
ServerThread(Socket socket ) {
this.socket = socket;
}
public void run(){
//3.连接建立后,通过输入流读取客户端发送的请求信息
try {
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//转为字符流
BufferedReader br = new BufferedReader(isr);//添加缓冲
String info = null;
while((info = br.readLine())!= null) {
System.out.println("服务器端收到的客户端传来的请求内容为:"+info);
}
//4.通过输出流向客户端发出响应信息
OutputStream os = socket.getOutputStream();
PrintWriter print = new PrintWriter(os);
print.write("欢迎您!");
print.flush();
socket.shutdownOutput();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务器端的实现
package Socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
*
* 服务器端
* 基于TCP协议的Socket通信
*
* */
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建ServerSocket对象,绑定监听端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8880);
// 2.通过accept方法监听客户端请求,等待客户端的连接
Socket socket = null;
int count = 0;
while (true) {
socket = serverSocket.accept();
Thread thread = new ServerThread(socket);
thread.start();
count++;
System.out.println("客户端的数量为:"+count);
}
// 5.关闭相关资源
//serverSocket.close();
}
}
客户端的实现
与上述无异
package Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
*
* 客户端
* 基于TCP协议的Socket通信
*
* */
class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
// 1.创建Socket对象,指明要连接的服务器地址和端口号
Socket socket = new Socket("localhost", 8888);
// 2.连接建立后,通过输出流向服务器端发送请求
OutputStream os = socket.getOutputStream();// 字节输出流
PrintWriter print = new PrintWriter(os); // 将字节输出流包装为打印输出流
print.write("用户名:admin; 密码:123");
print.flush();
socket.shutdownOutput();
// 3.通过输入流读取服务器端响应的信息
InputStream is = socket.getInputStream();// 字节输入流
InputStreamReader isr = new InputStreamReader(is);// 转为字符流
BufferedReader br = new BufferedReader(isr);// 添加缓冲
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("客户端收到的服务器端传来的响应内容为:" + info);
}
// 4.关闭相关资源
socket.close();
}
}