本文共 6056 字,大约阅读时间需要 20 分钟。
1.端口号
1)端口号是一个132位的整数 2)端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理 3)IP地址+端口号能够标识网络上的一个某一台主机的某一个进程 4)一个端口号只能被一个进程占用 2.注意 1)一个进程可以占用多个端口号,但是一个端口号不能被多个进程绑定 2) ip标识一台设备,端口标识进程 3) ip+port标识网络上的唯一一台设备的唯一进程 4) 了解五元组: 源ip,源端口,目的端口,目的ip,protocolTCP:
传输层协议,有连接,可靠传输,面向字节流 UDP: 传输层协议,不可靠的,无连接的,面向数据报内核和用户程序直接进行网络数据交互的接口 1)udp服务器(代码示例)
public class Server { public static void main(String[] args) throws IOException { //1.新建一个DatagramSocket DatagramSocket udpServerSocket=new DatagramSocket(9898); byte[] receiveBuffer=new byte[1024]; //2.等着客户端发送数据 DatagramPacket receivePacket=new DatagramPacket(receiveBuffer,receiveBuffer.length); udpServerSocket.receive(receivePacket); InetAddress clientAddress=receivePacket.getAddress(); System.out.printf("我从%s:%d收到了消息%n", clientAddress.getHostAddress(), receivePacket.getPort()); System.out.printf("我一共收到了%d字节的数据%n",receivePacket.getLength()); String message=new String( receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8"); System.out.println(message); udpServerSocket.close(); }}
2)客户端
public class Client { public static void main(String[] args) throws IOException { DatagramSocket udpClientSocket=new DatagramSocket(); String message="收到我的消息没?"; byte[] sendBuffer=message.getBytes("UTF-8"); byte[] serverIP=new byte[4]; serverIP[0]=(byte)192; serverIP[1]=(byte)168; serverIP[2]=(byte)137; serverIP[3]=(byte)1; InetAddress serverAddress=InetAddress.getByAddress(serverIP); DatagramPacket sendPacket=new DatagramPacket( sendBuffer, sendBuffer.length, serverAddress, 9898 ); udpClientSocket.send(sendPacket); udpClientSocket.close(); }}
运行结果:
我从192.168.137.1:57621收到了消息我一共收到了22字节的数据收到我的消息没?
这是一个简单的服务器与客户端,服务器接收到的是客户端发送给他的数据
如果要把消息回过去的话,则需要对代码进行以下修改: 客户端:udpClientSocket.receive(receivePacket); String responseMessage=new String( receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8" ); System.out.println(responseMessage); udpClientSocket.close();
服务器:
String message=new String( receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8"); System.out.println(message); byte[] sendBuffer=message.getBytes("UTF-8"); DatagramPacket sendPacket=new DatagramPacket( sendBuffer, sendBuffer.length, clientAddress, receivePacket.getPort() );
3)tcp服务器
public class Server { private static class TalkRunnable implements Runnable { private Socket clientSocket; TalkRunnable(Socket socket) { this.clientSocket = socket; } @Override public void run() { try { InetAddress clientAddress = clientSocket.getInetAddress(); int clientPort = clientSocket.getPort(); System.out.printf("有客户端连接上来 %s:%d%n", clientAddress.getHostAddress(), clientPort); // 获取 字节流 InputStream is = null; is = clientSocket.getInputStream(); // 字节流转换为字符流 InputStreamReader isReader = null; isReader = new InputStreamReader(is, "UTF-8"); // 字符流转换缓冲字符流 BufferedReader reader = new BufferedReader(isReader); // 获取输出字节流 OutputStream os = clientSocket.getOutputStream(); PrintStream out = new PrintStream(os, true, "UTF-8"); while (true) { String line = reader.readLine(); System.out.println("好友说: " + line); System.out.print("请回复>"); Scanner scanner=new Scanner(System.in); String response=scanner.nextLine(); out.println(response); out.flush(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { ServerSocket tcpServerSocket = new ServerSocket(8080); BlockingQueuequeue = new LinkedBlockingQueue<>(); ExecutorService pool = new ThreadPoolExecutor( 100, 100, 0, TimeUnit.MILLISECONDS, queue ); while (true) { Socket clientSocket = tcpServerSocket.accept(); pool.execute(new TalkRunnable(clientSocket)); } }}
客户端:
public class Client{ public static void main(String[] args) throws IOException { Scanner scanner=new Scanner(System.in); Socket tcpClientSocket = new Socket(); byte[] ipv4 = { (byte)192,(byte)168,(byte)100,(byte)110}; InetAddress serverAddress = InetAddress.getByAddress(ipv4); SocketAddress serverSocketAddress = new InetSocketAddress(serverAddress, 8080); tcpClientSocket.connect(serverSocketAddress); while (true) { System.out.print("请输出>"); String request=scanner.nextLine(); //通过字节流直接写入请求 OutputStream os=tcpClientSocket.getOutputStream(); PrintStream out=new PrintStream(os,true,"UTF-8"); out.println(request); out.flush(); //通过字节流,直接读取数据 InputStream is=tcpClientSocket.getInputStream(); BufferedReader reader=new BufferedReader( new InputStreamReader(is,"UTF-8") ); String response=reader.readLine(); System.out.println(response); } }}
以上是线程池版本的TCP服务器和客户端,可以实现简单的聊天功能
转载地址:http://dylzi.baihongyu.com/