TCP协议是面向连接的可靠的有序的以字节流的方式发送数据
基于TCP协议实现网络通信的类主要有两个
- 客户端的Socket类
- 服务器端的ServerSocket类
一、Socket通信原理
纯属个人理解:
服务器,指定端口创建ServerSocket对象,执行accept()方法获取socket实例,并监听客户端消息
客户端,指定服务器地址和端口,创建 Socket实例
两段都通过获取的socket实例得到相应的输入输出流然后进行读写实现通信
二、简单的单一通信
这个列子很简单,没什么实际用处,但能说明原理问题
1、服务器端
package com.daqsoft.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;
/**
* Created by yanbo on 2017/6/15.
* 基于TCP协议的Socket
* 服务器端(早于客户端启动)
* 创建步骤: 看下面
*/
public class Server {
public static void main(String[] argss){
try {
//1、指定端口号创建ServerSocket对象。
ServerSocket serverSocket = new ServerSocket(8888);//参数指定端口,端口建议指定1023以后的
//2、ServerSocket对象调用accept()方法获取socket实例,开始监听,等待客户端的连接
System.out.println("****服务器即将启动等待客户端的连接****");
Socket socket = serverSocket.accept();//处于阻塞状态,等待客户端的监听
//3、socket实例获取输入流读取客户端信息,通过输出流向客户端发送消息。
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);
}
socket.shutdownInput();//关闭输入流
//***********获取输出流向客户端发*******************************
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("欢迎您!!!!");//我们要发送的信息
pw.flush();//将缓冲输出
//4关闭相应资源。
br.close();
is.close();
isr.close();
socket.close();
serverSocket.close();
pw.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、客户端
package com.daqsoft.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;
/**
* Created by yanbo on 2017/6/15.
* 客户端
* 创建步骤: 见下面
*/
public class Client {
public static void main(String[] args) {
try {
//1、指定服务器地址和端口创建客户端Socket,
Socket socket = new Socket("localhost", 8888);
//2、客户端Socket获取输出流,向服务器发送信息,输入流获取服务器相应信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:admin;密码 123");//我们要发送的信息
pw.flush();//刷新缓存
socket.shutdownOutput();//关闭输出流
//*********获取输入流获取服务器相应信息**************
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) !=null){//循环读取客户端信息
System.out.println("我是客户端,服务器说-->"+info);
}
//3关闭相关资源。
pw.close();
os.close();
socket.close();
is.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
让后我们先启动服务器在启动客户端日志依次见下图