笔记:(本题可能需要的)
TCP协议:
TCP协议进行通信的两个应用进程:客户端、服务端。
使用TCP协议前,须先建立TCP连接,形成基于字节流的传输数据通道
传输前,采用“三次握手”方式,点对点通信,是可靠的
传输完毕,需释放已建立的连接,效率低
在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
在发送数据结束后,释放连接时需要经过四次挥手。
Socket类
网络上具有唯一标识的IP地址和端口号组合在一起构成唯一能识别的标识符套接字(Socket)。
Socket相关类API
ServerSocket类
ServerSocket类的构造方法:
ServerSocket(int port) :创建绑定到特定端口的服务器套接字。
ServerSocket类的常用方法:
Socket accept():侦听并接受到此套接字的连接。
Socket类
Socket类的常用构造方法:
public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket类的常用方法:
public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。
例题1:客户端发送内容给服务端,服务端将内容打印到控制台上。注意点:先启动服务端,在启动客户端这里的IP地址和端口号使用自己电脑的查询IP地址:在运行框输入ipconfig查询端口号:在运行框输入netstas -ano
客户端创建步骤:
》1创建一个Socket创建一个IP地址,创建一个端口号;Socket是由IP地址和端口号组合在一起组合在一起的;----------IP地址和端口号都是服务端的将IP地址和端口号传入Socket构造器中,创建Socket对象(即创建一个流套接字)
》发送数据通过Socket对象调用getOutputStream()方法------返回此套接字的输出流通过输出流对象调用write()方法--------书写要发送的信息
》关闭资源(在关闭前都要判断该对象是否创建成功)关闭流资源关闭流套接字资源
@Test// 客户端public void client() throws IOException {Socket socket = null;OutputStream os = null;try {//创建一个SocketInetAddress inetAddress = InetAddress.getByName("192.168.242.33");//声明对方的IP地址int port=10620;//声明对方的端口号socket = new Socket(inetAddress, port);//发送数据os = socket.getOutputStream();os.write("你好,我是客户端,请多多关照".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//关闭Sockettry {if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}try {if(os!=null)os.close();} catch (IOException e) {e.printStackTrace();}}}
服务端创建步骤
》创建一个ServerSocket(即创建绑定到特定端口的服务器套接字)
》调用accept(),接受客户端的Socket通过前面ServerSocket的对象调用accept()方法(阻塞式方法)-----------侦听并接受到此套接字的连接。调用accept()方法返回的是一个Socket类的对象--------表示连接成功,接受客户端的Socket
》接收数据通过前面得到的Socket的对象来调用getInputStream()------------得到流对象通过流的对象来读取数据
》关闭资源(在关闭前都要判断该对象是否创建成功)关闭ServerSocket资源关闭Socket资源关闭流资源
@Test//服务端public void server() throws IOException {ServerSocket serverSocket = null;Socket socket = null;//阻塞式的方法InputStream is = null;try {//创建一个ServerSocketint port=10620;serverSocket = new ServerSocket(port);//调用accept(),接受客户端的Socketsocket = serverSocket.accept();//接收数据is = socket.getInputStream();byte[] buffer=new byte[1024];int len;ByteArrayOutputStream baos = new ByteArrayOutputStream();//内部维护了一个byte数组while ((len=is.read(buffer))!=-1){//错误的
// String str = new String(buffer, 0, len);
// System.out.println(str);//正确的baos.write(buffer,0,len);}System.out.println(baos.toString());System.out.println("数据接收完毕");} catch (IOException e) {e.printStackTrace();} finally {//关闭Socket,ServerSocket,流try {if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}try {if(serverSocket!=null)serverSocket.close();} catch (IOException e) {e.printStackTrace();}try {if(is!=null)is.close();} catch (IOException e) {e.printStackTrace();}}}