1、Socket概述
(1)所谓socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。它是连接运行在网络上的两个程序间的双向通讯的端点。
(2)网络通讯其实指的就是socket间的通讯。通讯的两端都有socket,数据在两个socket之间通过IO来进行传输。
(3)使用socket进行网络通信的过程
1)服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。
2)客户程序根据服务器程序所在的主机名和端口号发出连接请求。
3)如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。
4)客户和服务器通过读、写套接字进行通讯。
2、基于TCP协议的socket编程
(1)创建TCP服务端步骤:
1)创建一个ServerSocket对象
2)调用accept()方法接受客户端请求
3)从socket中获取IO流
4)对IO流进行读写操作,完成与客户端的交互。
5)关闭IO流和Socket
(2)创建TCP客户端步骤:
1)创建一个Socket对象
2)从Socket中获取IO流
3)对IO流进行读写操作,完成与服务端的交互
4)关闭IO流和Socket
注:客户端和服务端进行数据传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。
(3)举例说明
1)服务器端
package com.iotek.tcpsocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);//创建一个ServerSocket对象
Socket socket = serverSocket.accept();//调用accept()方法来接受客户端的请求
System.out.println(socket.getInetAddress().getHostAddress() + "has connected!");
//获取socket对象的输入输出流
BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter pWriter = new PrintWriter(socket.getOutputStream(),true);
String line = null;
while((line = bReader.readLine())!=null){//读取客户端传过来的数据
if(line.equals("over")){
break;
}
System.out.println(line);
/*bWriter.write(line.toUpperCase());//把转换成大写的字符串传给客户端
bWriter.newLine();//换行,这样客户端才能知道输入什么时候结束的
bWriter.flush();*/
pWriter.println(line.toUpperCase());
}
//bWriter.close();
pWriter.close();
bReader.close();
socket.close();
System.out.println(socket.getInetAddress().getHostAddress() + "has disconnected!");
}
}
2)客户端
package com.iotek.tcpsocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888);
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
//BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
PrintWriter pWriter = new PrintWriter(socket.getOutputStream(),true);
BufferedReader bw = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String line = bReader.readLine();//获取键盘所输入的字符串
/*bWriter.write(line);
bWriter.newLine();//换行,这样服务端才能识别一行的结束
bWriter.flush();*/
pWriter.println(line);
if(line.equals("over")){
break;
}
System.out.println(bw.readLine());//获取服务端传来的大写字符串
}
bReader.close();
bw.close();
//bWriter.close();
pWriter.close();
socket.close();
}
}
为了更直观地理解服务器端和客户端的交互过程,我们将两个文件拷贝到f盘当中。使用下列命令进行编译和执行。
//编译
javac -d . *.java
//开启服务器
java com.iotek.tcpsocket.TCPServer
//开启客户端,这里另外开启一个窗口
java com.iotek.tcpsocket.TCPClient