TCP协议回顾:
TCP是一种 面向连接,安全,可靠的传输数据的协议
传输前,采用三次握手方式,点对点通信是可靠的
在连接中可以进行大数据量的传输
在java中只要使用java.net.Socket类实现通信。底层即是使用了TCP协议
Socket(客户端)
构造器
public Socket(String host,int port) 创建发送端打的Socket对象与服务端连接,参数为服务端程序的IP和端口
成员方法
OutputStream getOutputStream () 获得字节输出流对象
InputStream getInputStream( ) 获得字节输入流对象
客户端发送消息
创建客户端的Socket对象,请求与服务端的连接
使用Socket对象调用getOutputStream()方法的到字节输出流
使用字节输出流完成数据的发送
释放资源:关闭Socket管道(用户离开了,你在关管道)
package properties;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
// 创建Socket对象
Socket sk=new Socket("127.0.0.1", 2345);//第一个参数对方服务端ip地址,第二个参数服务端端口号
//获得字节输出流管道
OutputStream ots=sk.getOutputStream();
//封装成高级流
PrintStream ps=new PrintStream(ots);
//发送数据
ps.println("我是客户端");
//关闭资源
//ps.close(); 可以先不关,关闭的话可能导致数据没发完管道就没了
} catch (Exception e) {
e.printStackTrace();
}
}
}
ServerSocket(服务端)
构造器
public ServerSocket(int port ) 注册服务端端口
成员方法
public Socket accept( ) 等待接收客户端的Socket通信连接 连接成功返回Socket对象与客户端建立端到端通信
服务端实现步骤
创建ServerSocket对象,注册服务端端口号
调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象
通过Socket对象调用GetinputStream()方法得到字节输入流,完成数据的接收
释放资源:关闭socket管道
package TCP一发一收;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
System.out.println("--------服务端-------");
// 注册服务端端口
ServerSocket sst=new ServerSocket(4567);
//创建管道
Socket sk=sst.accept();
//创建字节输入流
InputStream is=sk.getInputStream();
//转换为高级流
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//开始读内容
String read;
if((read=br.readLine())!=null) {//发一行就要收一行不然报错
System.out.println("来自"+sk.getRemoteSocketAddress()+"的信息:" +read);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TCP通信的基本原理?
客户端怎么发,服务端就应该怎么收
客户端如果没有消息,服务端会进入阻塞等待
Socket一方关闭或者出现异常,对方Socket也会失效或者出错