package com.zgjy.demo2;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
* TCP客户端实现,要求,服务器端,必须开启,如果服务器没有开启,那么连接直接抛出异常Connection refused: connect
*
* 使用的类: Socket
*
* 1. 连接服务器,就是连接服务器的IP地址和端口号
* Socket(String host, int port) : 两个参数,host 传入一个StringIp地址,int类型的端口号
* 2. TCP协议的传输过程,是需要通过流来实现(字节流) ,Socket方法s.getOutputStream(),获取到字节的输出流资源
*
* 3. 获取到输出流,向服务器写数据 ,使用write(byte[] b);
* 4. 关闭资源 close()
*
*/
public class TCPClient {
public static void main(String[] args) throws Exception{
// 1. 创建Socket对象,绑定服务器的IP地址和端口号
Socket s = new Socket("127.0.0.1",8888);
// 2. 通过Socket类中的getOutputStream()方法,获取到字节的输出流,用于向服务器中写入数据
OutputStream os = s.getOutputStream();
// 3. 调用流的write方法,写入数据
os.write("TCP,在吗?".getBytes());
InputStream is = s.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
System.out.println(new String(b,0,len));
// 4. 关闭资源
s.close();
}
}
package com.zgjy.demo2;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
* TCP服务器端
* ServerSocket
*
* 1. ServerSocket开启,并且监听上指定的端口号
* ServerSocket(int port)
* 2. 获取到客户端的套接字对象 Socket
* 方式: ServerSocket 方法 : accept() 返回值,就是一个Socket对象
* 3. 通过客户端的套接字对象,获取字节输入流, getInputStream()
* 使用字节输入流的read方法,读取服务器端发送的内容
* 4. 关闭资源
*
*/
public class TCPServer {
public static void main(String[] args) throws Exception{
// 1. 该行代码运行,实现服务器指定端口号的监听
ServerSocket ss = new ServerSocket(8888);
System.out.println("我在等客户端给我发送");
// 2. 获取客户端的套接字对象,accept方法,同时具有阻塞功能,等待客户端发送请求
Socket s = ss.accept();// 阻塞
System.out.println("我已经获取到客户端的对象");
// 3. 通过套接字对象获取输入流
InputStream is = s.getInputStream();
// 创建字节数组的缓冲
byte[] b = new byte[1024];
// 4. 读取客户端传入的数据
int len = is.read(b);
System.out.println(new String(b,0,len));
// 向客户端返回收到的数据信息
OutputStream os = s.getOutputStream();
os.write("收到,可以连接!".getBytes());
// 5. 关闭资源
ss.close();
}
}