JavaSE11—网络编程初步
JavaSE11—网络编程初步
1.背景知识
1)端口
客户机可能会同时连接多个服务器,客户机为了能和自己想要沟通的服务器进行通信必须设立专门的端口。网络程序设计中的端口并非真实物理存在的,而是一个虚拟的连接装置。端口被规定为一个0~65535的整数。
2)套接字
套接字(Socket)是用来接收或传送分组的一个端点。在Java中套接字用Socket类来表示,Java程序员只需要创建Socket对象来获取套接字实例即可使用。
2.TCP协议与TCP编程
1)TCP协议
TCP(Transmission Control Protocol,传输控制协议)负责数据或文件的分组与重组,与IP协议一起使用,称之为TCP/IP协议。IP协议负责发送与接收数据包。
TCP协议提供两台计算机间可靠的数据传颂。
TCP网络程序设计是指利用Socket类,编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户端程序。
2)交互过程
1.服务器程序创建一个ServerSocket,调用accept()方法等待客户端连接。
2.客户端程序创建一个Socket,请求与服务器的连接。
3.服务器接收客户的连接请求,同时创建一个新的Socket与客户建立连接,服务器继续等待新的连接。
3)TCP编程常用类
1.InetAddress类
常用方法:
getByName(String host) 确定主机IP
getHostAddress() 返回IP字符串
getHostName() 获取此IP的主机名
getLocalHost() 返回本地主机InetAddress对象
toString() 将IP地址转换成字符串。
注意:以上方法都会抛出异常,因此必须进行异常处理
实例:创建InetAddressDemo,在主方法中使用InetAddress类获取本机信息
import java.net.*;public class JavaTest{public static void main(String[] args){InetAddress intAddress;try{intAddress = InetAddress.getLocalHost();String localname = intAddress.getHostName();String localip = intAddress.getHostAddress();System.out.println("Localname:"+localname);System.out.println("IP:"+localip);}catch(Exception e){e.printStackTrace();}}}2.服务器套接字import java.net.ServerSocket;import java.net.Socket;public class ServerSocketDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry{ServerSocket serverSocket = new ServerSocket(1212);System.out.println("服务器套接字创建成功!");while(true){System.out.println("等待连接。。。");Socket socket = serverSocket.accept();System.out.println("连接成功!");}}catch(Exception e){e.printStackTrace();}}}注意:accpet()方法会堵塞线程的继续执行,知道接收到客户的呼叫。import java.io.DataInputStream;import java.io.DataOutputStream;import java.net.ServerSocket;import java.net.Socket;public class ServerSocketDemo {/** * @param args */public static void main(String[] args) {try{ServerSocket serverSocket = null;Socket clientSocket = null;String str = null;DataOutputStream out = null;DataInputStream in = null;serverSocket = new ServerSocket(4331);System.out.println("等待连接");clientSocket = serverSocket.accept();in = new DataInputStream(clientSocket.getInputStream());out = new DataOutputStream(clientSocket.getOutputStream());while(true){str = in.readUTF();//读取客户端信息out.writeUTF(str); System.out.println("收到: "+str);Thread.sleep(1000);}}catch(Exception e){e.printStackTrace();}}}客户端:import java.io.DataInputStream;import java.io.DataOutputStream;import java.net.Socket;public class SocketDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString str = null;Socket clientSocket;DataInputStream in = null;DataOutputStream out = null;try{clientSocket = new Socket("127.0.0.1",4331);in = new DataInputStream(clientSocket.getInputStream());out = new DataOutputStream(clientSocket.getOutputStream());out.writeUTF("我是客户端!!");int i = 0;while(true){str = in.readUTF(); //读取流信息out.writeUTF(i++ +" "); //向流中写入数字System.out.println("客户端收到:"+str);Thread.sleep(1000);}}catch(Exception e){e.printStackTrace();}}}