●TCP是一种面向连接,安全、可靠的传输数据的协议
●传输前,采用“三次握手”方式,点对点通信,是可靠的
●在连接中可进行大数据量的传输

●注意:在java中只要是使用java.net.Socket类实现通信,底层即是使用了TCP协议
| 构造器 | 说明 |
|---|---|
| public Socket(String host , int port) | 创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口 |
| 方法 | 说明 |
|---|---|
| OutputStream getOutputStream() | 获得字节输出流对象 |
| InputStream getInputStream() | 获得字节输入流对象 |
●需求:客户端实现步骤
①创建客户端的Socket对象,请求与服务端的连接。
②使用socket对象调用getOutputStream()方法得到字节输出流。
③使用字节输出流完成数据的发送。
④释放资源:关闭socket管道。
①TCP通信的客户端的代表类是谁?
●Socket类
●public Socket(String host , int port)
②TCP通信如何使用Socket管道发送、接收数据?
●OutputStream getOutputStream():获得字节输出流对象(发)
●InputStream getInputStream():获得字节输入流对象(收)
| 构造器 | 说明 |
|---|---|
| public ServerSocket(int port) | 注册服务端端口 |
| 方法 | 说明 |
|---|---|
| public Socket accept() | 等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信 |
●需求:服务端实现步骤
①创建ServerSocket对象,注册服务端端口。
②调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
③通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
④释放资源:关闭socket管道
①TCP通信服务端用的代表类?
●ServerSocket类,注册端口。
●调用accept()方法阻塞等待接收客户端连接。得到Socket对象。
②TCP通信的基本原理?
●客户端怎么发,服务端就应该怎么收。
●客户端如果没有消息,服务端会进入阻塞等待。
●Socket一方关闭或者出现异常、对方Socket也会失效或者出错。




/**
目标:完成Socket网络编程入门案例的客户端开发,实现1发1收。
*/
public class ClientDemo01 {
public static void main(String[] args) {
try {
System.out.println("===客户端启动===");
// 1、创建Socket通信管道请求有服务端的连接
// public Socket(String host, int port)
// 参数一:服务端的IP地址
// 参数二:服务端的端口
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
// 2、从socket通信管道中得到一个字节输出流 负责发送数据
OutputStream os = socket.getOutputStream();
// 3、把低级的字节流包装成打印流
PrintStream ps = new PrintStream(os);
// 4、发送消息
ps.println("我是TCP的客户端,我已经与你对接,并发出信息:在吗?");
ps.flush();
// 关闭资源。注意哦,不用时才关,不要随便关
// socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
目标:开发Socket网络编程入门代码的服务端,实现接收消息
*/
public class ServerDemo02 {
public static void main(String[] args) {
try {
//先启动服务端
System.out.println("===服务端启动成功===");
// 1、注册端口
ServerSocket serverSocket = new ServerSocket(9999);
// 2、必须调用accept方法:等待接收客户端的Socket连接请求,建立Socket通信管道
Socket socket = serverSocket.accept();
// 3、从socket通信管道中得到一个字节输入流
InputStream is = socket.getInputStream();
// 4、把字节输入流包装成缓冲字符输入流进行消息的接收
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 5、按照行读取消息
String msg;
if ((msg = br.readLine()) != null) {
System.out.println(socket.getRemoteSocketAddress() + "说了: " + msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}