tcp和udp套接字编程(java实现)

关键词:

在了解网络编程之前,我们先了解一下什么叫套接字

套接字即指同一台主机内应用层和运输层之间的接口

由于这个套接字是建立在网络上建立网络应用的可编程接口

因此也将套接字称为应用程序和网络之间的应用程序编程接口!

 

关于TCP和UDP这里就不作太多介绍了,我们知道TCP是面向连接的,UDP是不面向连接的,TCP可靠,UDP不可靠即可!
我们来设计一个应用来示范一下,流程:

  1. 客户机从键盘读取一行字符串,并通过套接字发送到服务器。
  2. 服务器从连接的套接字获取这行字符串,并对其进行修改(将小写转为大写),最后再发回客户端。
  3. 客户机读取到服务器发送的修改后的字符串,并输出到屏幕。

不说太多了,直接上代码:

TCP套接字编程:

 客户端:

package TCP套接字编程;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        // 创建两个String类型的字符串用来接收和发送字符
        String sentence;
        String modifiedSentence;

        // 创建输入流,用来接收键盘输入
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
                System.in));

        // 创建一个Scoket型的clientScoket用来发起服务器和客户机之间的连接
        String postname = "169.264.187.20";// 客户端ip地址(请用自己电脑的ip地址代替)
        Socket clientSocket = new Socket(postname, 6789);

        // 创建向服务器发送信息的输出流
        DataOutputStream outToServer = new DataOutputStream(
                clientSocket.getOutputStream());

        // 创建输入流,用来接收来自服务器的字节流
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));

        // 读取要发送的数据
        sentence = inFromUser.readLine();

        // 向服务器发送数据
        outToServer.writeBytes(sentence + '\n');

        // 获取从服务器接收的数据
        modifiedSentence = inFromServer.readLine();

        // 打印接收数据
        System.out.println("From Server:" + modifiedSentence);

    }

}

服务器端:

package TCP套接字编程;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        // 从客户端接收的字符串,要发送给客户端的字符串
        String clientSentence;
        String serverSentence;

        // 服务器打开6789端口,建立连接
        ServerSocket welcomeSocket = new ServerSocket(6789);

        while (true) {// 服务器的6789端口一直打开

            // 用此连接来获取和发送客户端数据流
            Socket connectionSocket = welcomeSocket.accept();

            // 获取来自客户端的数据流
            BufferedReader inFromClient = new BufferedReader(
                    new InputStreamReader(connectionSocket.getInputStream()));

            // 准备发送更改后的数据流
            DataOutputStream outToClient = new DataOutputStream(
                    connectionSocket.getOutputStream());

            // 读取收到的数据
            clientSentence = inFromClient.readLine();

            // 将读取到的数据都中的小写字母改为大写字母
            serverSentence = clientSentence.toUpperCase() + '\n';

            // 发送修改后的数据给客户端
            outToClient.writeBytes(serverSentence);

        }
    }
}

UDP套接字编程:

客户端:

package UDP套接字编程;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) throws IOException {
        // 读取键盘输入的字节流
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(
                System.in));

        // 为客户端创造一个传输信息的门,但是并没有像TCP那样建立连接
        DatagramSocket clientSocket = new DatagramSocket();

        // 调用DNS查询,得到主机名对应的IP地址
        InetAddress IPAddress = InetAddress.getByName(null);//null的话得到的是自己的IP地址
        System.out.println(IPAddress);

        // 定义需要发送的字节数组
        byte[] sendData = new byte[1024];// 不能动态开数组。。。

        // 定义需要接收的字节数组
        byte[] receiveData = new byte[1024];

        // 将从键盘接收到的数据先用字符串存起来
        String sentence = inFromUser.readLine();

        // 将字符串转为字节存入sendData
        sendData = sentence.getBytes();

        // 准备发送UDP数据报,里面包含发送内容和目的地址等信息
        DatagramPacket sendPacket = new DatagramPacket(sendData,
                sendData.length, IPAddress, 9878);

        // 用这个门来发送数据报
        clientSocket.send(sendPacket);

        // 准备获取从服务器返回的数据报
        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                receiveData.length);

        // 用这个门来接收服务器发的数据报
        clientSocket.receive(receivePacket);

        // 将获取的数据报转换为String类型
        String modifiedSentence = new String(receivePacket.getData());

        // 打印从服务器收到的内容
        System.out.println("From Server:" + modifiedSentence + '\n');

        // 关闭这个门
        clientSocket.close();

    }

}

服务器端:

package UDP套接字编程;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {
    public static void main(String[] args) throws IOException {

        // 创建一个门,在9878端口
        DatagramSocket serverSocket = new DatagramSocket(9878);

        while (true) {

            // 定义接收数据的字节数组
            byte[] receiveData = new byte[1024];

            // 定义发送数据的字节数组
            byte[] sendData = new byte[1024];

            // 创建UDP数据报对象,准备接收UDP数据报
            DatagramPacket receivePacket = new DatagramPacket(receiveData,
                    receiveData.length);

            // 接收UDP数据报
            serverSocket.receive(receivePacket);

            // 将收到的UDP数据报转换为String字符串
            String sentence = new String(receivePacket.getData());

            // 得到接收到的UDP数据报的源IP地址
            InetAddress IPAddress = receivePacket.getAddress();

            // 得到接收到的UDP数据报的源端口号
            int port = receivePacket.getPort();

            // 小写字母全部变为大写字母
            String capitalized = sentence.toUpperCase();

            // 将字符串转换为字节数组以便发送
            sendData = capitalized.getBytes();

            // 准备发送字节数组,做好封装UDP数据报工作
            DatagramPacket sendPacket = new DatagramPacket(sendData,
                    sendData.length, IPAddress, port);

            // 通过门正式发送UDP数据报
            serverSocket.send(sendPacket);

        }
    }
}

 

分析:

先运行服务器端代码,这样服务器才能工作:打开相应端口,做好接收数据的准备

然后运行客户端代码,发送数据

服务器工作时,对应端口一直的打开的,随时准备响应客户端的请求

参考书籍:《计算机网络自顶向下方法》

 

java-web学习-java基础-网络编程(tcp和udp)附tcp实现通信

...ress类Port网络通信协议URL定位Restful的风格TCP网络编程Socket套接字Java下的基于Socket的TCP编程UDP网络编程Java下的UDP编程实践代码(TCP实现)网络编程“Java是Internet上的语言”,其从语言级别上提供了完备的对网络应用程序的支持,联... 查看详情

java网络编程编程之tcp编程和udp编程(代码片段)

...在学习网络编程前先来复习一下IP地址端口号协议,套接字的相关概念。IP地址:用来唯一标识全球连接在互联网上的主机的接口的标识符端口:端口是指软件端口,是应用层的各种协议进程与运输实体进行层间 查看详情

探索udp套接字编程

...好坏之分,只是二者的适用场景不同罢了。  典型的UDP套接字编程模型是客户端不予服务端建立连接,而只是调用sendto函数来向服务端发 查看详情

探索udp套接字编程

...好坏之分,只是二者的适用场景不同罢了。  典型的UDP套接字编程模型是客户端不予服务端建立连接,而只是调用sendto函数来向服务端发送数 查看详情

python网络编程—socket套接字编程(udp)(代码片段)

套接字介绍1.套接字:实现网络编程进行数据传输的一种技术手段2.Python实现套接字编程:importsocket3.套接字分类流式套接字(SOCK_STREAM):以字节流方式传输数据,实现tcp网络传输方案。(面向连接--tcp协议--可靠的--流式套接字)数据... 查看详情

go_socket编程(代码片段)

套接字级编程Agenda网络编程的基础方法,将涉及到主机和服务寻址,也会考虑到TCP和UDP如何使用GO的TCP和UDP相关的API来构建服务器和客户端。介绍了原生套接字来实现自己的协议TCP/IP协议栈TCP是一个面向连接的协议,UDP(UserDatagr... 查看详情

tcp与udp实例(代码片段)

...ize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);sockfd指定发送端套接字描述符;buf指明一个存放应用程序要发送数据的缓 查看详情

tcp与udp实例(代码片段)

...ize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);sockfd指定发送端套接字描述符;buf指明一个存放应用程序要发送数据的缓 查看详情

python网络编程—socket套接字编程(tcp)(代码片段)

套接字介绍1.套接字:实现网络编程进行数据传输的一种技术手段2.Python实现套接字编程:importsocket3.套接字分类流式套接字(SOCK_STREAM):以字节流方式传输数据,实现tcp网络传输方案。(面向连接--tcp协议--可靠的--流式套接字)数据... 查看详情

网络编程————javasocket(udp/tcp套接字)(代码片段)

文章目录Socket是什么?TCP/UDP套接字UDP套接字DatagramSocketAPIDatagramSocket构造方法DatagramSocket方法InetSocketAddressAPI基于UDP实现回显服务器运行结果TCP套接字ServerSocketAPIServerSocket构造方法ServerSocket方法SocketAPISocket构造方法Socket方法TCP... 查看详情

python之socket编程(tcp/udp)

参考技术Asocket(family,type[,protocal])使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。有效的端口号:0~65535但是小于1024的端口号基本上都预留给了操作系统POSIX兼容系统(如Linux、MacOSX等),在/etc/services文件中... 查看详情

网络linuxlinux网络编程-tcp,udp套接字编程及代码示范(代码片段)

这里写目录标题UDP类UDP服务端单执行流UDP客户端TCP类TCP单执行流服务器TCP客户端TCP多执行流(线程)TCP多执行流(进程)本文我们分为TCP和UDP协议网络程序的编写:他们的区别如下:项目特点UDP用户数据报协议,无需连接&#... 查看详情

go_socket编程(代码片段)

套接字级编程Agenda网络编程的基础方法,将涉及到主机和服务寻址,也会考虑到TCP和UDP如何使用GO的TCP和UDP相关的API来构建服务器和客户端。介绍了原生套接字来实现自己的协议TCP/IP协议栈TCP是一个面向连接的协议,U... 查看详情

python网络编程—(tcpudp区别)

tcp套接字和udp套接字编程区别1.流式套接字是以字节流方式传输数据,数据报套接字以数据报形式传输2.tcp套接字会有粘包,udp套接字有消息边界不会粘包3.tcp套接字保证消息的完整性,udp套接字则不能4.tcp套接字依赖listenaccept建... 查看详情

Java 客户端混合 TCP 和 UDP 功能

...写客户端-服务器应用程序,客户端和服务器可以通过UDP套接字进行交互,通过TCP套接字进行乒乓球交互,并且用户(客户端)可以互相聊天通过TCP套接字。我有两个独立的TCP和UDP线程。我将服务器的TCP和UDP功能融合在一起(只 查看详情

java网络编程(代码片段)

...tName()getHostAddress()二、TCP和UDP编程记忆点:1.TCP使用流套接字;UDP使用数据报套接字2.对于客户端:TCP在套接字的构造器里给出服务器端的IP和端口号;UDP的套接字构造器用空参的,在数据报中给出3.对于服务器&... 查看详情

网络协议趣谈基于tcp和udp的套接字socket编程

在TCP和UDP协议中主要分客户端和服务端,在写程序的时候也同样这样分Socket这个名字很有意思,可以作插口或者插槽讲。虽然是软件程序,但可以想象为弄一根网线,一头插在客户端,一头插在服务端,然... 查看详情

基于socket的udp和tcp编程介绍

基于Socket的 UDP和 TCP编程介绍 一、概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结TCP/IP模型中传输层一层中的两个不同的通信协议。 TCP:传输控制协议,一种面向连接的协议,给用户进程提供可... 查看详情