博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
套接字编程
阅读量:3960 次
发布时间:2019-05-24

本文共 6056 字,大约阅读时间需要 20 分钟。

1.理解源IP地址和目的IP地址

1.端口号

1)端口号是一个132位的整数
2)端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
3)IP地址+端口号能够标识网络上的一个某一台主机的某一个进程
4)一个端口号只能被一个进程占用
2.注意
1)一个进程可以占用多个端口号,但是一个端口号不能被多个进程绑定
2) ip标识一台设备,端口标识进程
3) ip+port标识网络上的唯一一台设备的唯一进程
4) 了解五元组:
源ip,源端口,目的端口,目的ip,protocol

2.认识TCP协议和UDP协议

TCP:

传输层协议,有连接,可靠传输,面向字节流
UDP:
传输层协议,不可靠的,无连接的,面向数据报

3.Socket编程

内核和用户程序直接进行网络数据交互的接口  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); BlockingQueue
queue = 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/

你可能感兴趣的文章
浏览器低成本实现免手提的用户体验,使用人脸、手势、姿态追踪 | Mix群聊
查看>>
这个世界上肯定有另一个我,做着我不敢做的事,过着我想过的生活 | MixAI 知识库 No.70...
查看>>
表情包数据挖掘 | Mix群聊
查看>>
如何阅读科研论文
查看>>
理解本真的REST架构风格
查看>>
10款免费且开源的项目管理工具
查看>>
java调用javascript :js引擎rhino
查看>>
asp 中常用的文件处理函数
查看>>
ADO中sqlserver存储过程使用
查看>>
Linux KernelTech版FAQ 1.0
查看>>
ntfs分区iis故障的解决
查看>>
个人创业“六大死穴”
查看>>
最重要的 12个 J2EE 最佳实践
查看>>
通过Java Swing看透MVC设计模式
查看>>
Java 理论与实践: 关于异常的争论
查看>>
编写高效的线程安全类
查看>>
提高Java代码可重用性的三个措施
查看>>
编写跨平台Java程序注意事项
查看>>
富人和穷人的12个经典差异
查看>>
java 注意事项[教学]
查看>>