===============================
tcp通信协议
面向连接,基于IO流传输。有特有的通道,能传输大数据,通过三次握手机制连接,可靠协议,
因为必须通信前必须建立链接,所以效率稍低
例:电话,文件的传送
tcp协议下的通讯
1 Socket(客户端) tcp的客户端一旦启动就要与客户端进行连接
2 SeverSocket(服务类)
Socket类
SocketChannel 类
ServerSocket类
ServerSocketChannel类
TCP通信测试
服务端
public class Test2
{
public static void main(String[] args) throws IOException
{
//服务端指定一个端口
ServerSocket serverSocket = new ServerSocket(8080);
//接收客户端发过来的Socket,也是阻塞的
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
os.write("客户端你好".getBytes());
byte[] arr = new byte[1024];
int length = 0;
length = is.read(arr);
System.out.println(socket.getLocalAddress() + new String(arr, 0, length));
serverSocket.close();
}
}
客户端
class Test1
{
public static void main(String[] args) throws UnknownHostException, IOException
{
//创建一个Socket对象,需要主机对象和端口
Socket socket = new Socket(InetAddress.getLocalHost(), 8080);
// 创建一个客户端的Socket对象,因为是基于IO流,
//所以是向缓存中写入数据先,这也就是需要发送的内容
OutputStream os = socket.getOutputStream();
os.write("服务器你好".getBytes());
// 接收服务器发过来的数据,因为读出来是字节流,文字要这样处理,当然也可以转换成字符流
InputStream is = socket.getInputStream();
byte[] arr = new byte[1024];
int length = 0;
length = is.read(arr); //读取进数组里
System.out.println(new String(arr, 0, length));//然后解码
socket.close();
// 关闭socket资源,会把流一起关闭,所以只要关闭这一个
}
}
1 使用字符流写出的时候注意一定要刷出,因为不同于字节流,字节流需要使用缓冲字节流才需缓冲,而字符流不是
2 客户端向服务器发送一行数据的时候(使用了readline),因为\r\n是读取不出来的,所以服务器那边也没有接受到\r\n
所以如果服务器那么也是readline读取的,就读取不了,因为readline是根据\r\n才判断是1行的,才会读取,而服务器是
通过客户端发送数据读取的,所以客户端必须在发送数据的时候加上\r\n
客户端
class Test1
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket socket = new Socket(InetAddress.getLocalHost(), 8080);
//获取输出流
OutputStreamWriter write = new OutputStreamWriter(socket.getOutputStream());
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));// 从键盘读入字节数据,然后转换到字符数据,然后存入缓存字符
String value = null;
while ((value = read.readLine()) != null)
{
write.write(value + "\r\n"); //手动加上\r\n
write.flush();
}
socket.close();
}
}
服务端
public class Test2
{
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = new ServerSocket(8080);
//阻塞接受数据
Socket socket = serverSocket.accept();
//获取输入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String value = null;
while ((value = bufferedReader.readLine()) != null)
{
System.out.println("服务端接受到的数据: " + value);
}
serverSocket.close();
}
}