Java 类
客户端: java.net.Socket类表示,创建Socket对象,向服务端发送请求连接,服务端响应请求,两者建立
连接成功,就可以使用IO流进行通信。
构造方法:
1.Socket(String host, int port) //指定IP和端口号
成员方法:
1.getInputStream() //获取网络字节输入流
2.getOutputStream() //获取网络字节输出流
3.close() //关闭套接字
服务端: java.net.ServerSocket类表示,创建ServerSocket对象,开启服务等待客户端连接。使用accept
获取到请求的客户端Socket对象,服务器使用客户端的字节输入流读取客户端发送的数据再用客户端的字节
输出流给客户端回写数据。
构造方法:
1.ServerSocket(int port) //指定端口号
成员方法:
1.Socket accept() //侦听套接字的连接,获取客户端的套接字对象
客户端
public static void main(String[] args) throws IOException {
//创建客户端套接字对象,指定主机和端口号
Socket cs = new Socket("127.0.0.1",8192);
//创建字节输入流,向服务端写数据
OutputStream os = cs.getOutputStream();
os.write("hello server".getBytes());
//获取到服务端推送的数据并进行读取
InputStream is = cs.getInputStream();
byte[] bs = new byte[1024];
int len = is.read(bs);
System.out.println(new String(bs,0,len));
cs.close();//关闭客户端套接字
}
服务端
public static void main(String[] args) throws IOException {
//创建服务端套接字
ServerSocket ss = new ServerSocket(8192);
//监听请求的客户端套接字对象
Socket cs = ss.accept();
//获取客户端输入流,进行读取
InputStream is = cs.getInputStream();
byte[] bs = new byte[1024];
int len = is.read(bs);
System.out.println(new String(bs,0,len));
//通过客户端输出流向客户端推送消息
OutputStream os = cs.getOutputStream();
os.write("Hi Client".getBytes());
cs.close();//关闭与客户端的连接
ss.close();//关闭服务端套接字
}
阻塞问题
read()方法从输入流中读取一个字节,如果没有输入可用,此方法将一直阻塞。
//对于TCP套接字,任何以前写入的数据都将被发送,并且后跟TCP的正常连接终止序列
fc.shutdownOutput(); //禁用此套接字的输出流。
文件上传案例
客户端
public static void main(String[] args) throws IOException {
//创建客户端套接字对象,指定IP地址和端口
Socket fc = new Socket("127.0.0.1",8192);
OutputStream os = fc.getOutputStream();//获取网络输出流
//利用本地输入流读取本地文件,再使用网络输出流传输文件
String filePath = "D:\\Project\\Net\\Basic\\tcp\\img\\source.png";
FileInputStream localIS = new FileInputStream(filePath);
int len;
byte[] bs = new byte[1024];
while ((len = localIS.read(bs)) != -1) {
os.write(bs,0,len);
}
//对于TCP套接字,任何以前写入的数据都将被发送,并且后跟TCP的正常连接终止序列
fc.shutdownOutput();//禁用此套接字的输出流
//读取服务段返回的响应数据
InputStream is = fc.getInputStream();
while ((len = is.read(bs)) != -1) {
System.out.println(new String(bs,0,len));
}
localIS.close();//关闭本地输入流
fc.close();//关闭客户端套接字
}
服务端
public static void main(String[] args) throws IOException {
//创建服务端套接字,设置端口号
ServerSocket fs = new ServerSocket(8192);
//监听客户端请求,获取客户端套接字对象
Socket fc = fs.accept();
//创建本地字节输出流
String filePath = "D:\\Project\\Net\\Basic\\tcp\\img\\copy.png";
FileOutputStream localOS = new FileOutputStream(new File(filePath));
//通过客户端套接字读取网络字节输入流并利用本地字节输出流写入本地
InputStream is = fc.getInputStream();
int len;
byte[] bs = new byte[1024];
while ((len = is.read(bs)) != -1) {
localOS.write(bs,0,len);
}
//通过客户端套接字利用网络字节输出流给客户端回传数据
OutputStream os = fc.getOutputStream();
os.write("上传成功".getBytes());
localOS.close();//关闭本地字节输入流
fc.close();//断开客户端连接
fs.close();//关闭服务端套接字
}