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

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

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

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

关于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); }
}
}

分析:

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

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

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

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

TCP和UDP套接字编程 (java实现)的更多相关文章

  1. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  2. java基础----->TCP和UDP套接字编程

    这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 . TCP套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...

  3. 利用Python进行TCP、UDP套接字编程

    参考:http://www.cnblogs.com/whatbeg/p/5155524.html http://www.cnblogs.com/nzyjlr/p/4236287.html

  4. JavaTCP和UDP套接字编程

    在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...

  5. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  6. 【转】 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  7. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  8. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  9. 计算机网络实验 UDP套接字编程

    这是个傻瓜式操作教程 西科大计算机网络实验 UDP套接字编程 我用自己的Ubuntu16.04来举例,实验室的是虚拟机,差不多 只针对第三个题目,修改服务器来通过响应客户端发送的GetTime并发送给 ...

随机推荐

  1. BZOJ4806(SummerTrainingDay03-K dp)

    炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 464  Solved: 243[Submit][Status][Discuss] Descript ...

  2. JS 闭包 p5

    终于到闭包了,写了一晚上,好激动: 首先闭包,个人是这样理解的(比较好记):闭包是一种能力,是一种可以访问内部函数作用域的能力或者说是一种行使权力,一旦你拥有这个能力,你将可以访问内部函数的作用域.

  3. Vue中改变对象的注意事项

    数组更改注意事项 Vue无法检测到以下方式变动的数组 当你利用索引直接设置一个项时,例如:vm.items[index] = newValue 当你修改数组的长度时,例如:vm.items.lengt ...

  4. CSS3 鼠标划上图片放大

    td img{transition: all 1s}/*鼠标划上,图片1s全部显示完成*/ td img:hover{ transform: scale(5) translateX(50%) tran ...

  5. Java:基本数据类型与类型转换

    相关内容: 基本数据类型 整型 浮点型 字符型 布尔型 数据类型转换 数组 首发时间:2017-06-22 21:18 修改时间: 2018-03-16 15:40  :修改了一下文字布局和样式,增加 ...

  6. 使用python快速搭建本地网站

    如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS,Nodejs等.那么, Python 可能帮助你.使用Python可以完成一个简 ...

  7. Azure Resource Manager 概述

    应用程序的基础结构通常由许多组件构成:可能有虚拟机.存储帐户和虚拟网络,或 Web 应用.数据库.数据库服务器和第三方服务. 这些组件不会以独立的实体出现,而是以单个实体的相关部件和依赖部件出现. 如 ...

  8. Spark 基本概念 & 安装

    1. Spark 基本概念 1.0 官网 传送门 1.1 简介 Spark 是用于大规模数据处理的快如闪电的统一分析引擎. 1.2 速度 Spark 可以获得更高的性能,针对 batch 计算和流计算 ...

  9. ZooKeeper 集群的安装部署

    0. 说明 ZooKeeper 安装在 s102.s103.s104上,这三个节点同时是 Hadoop 的 DataNode 1. ZooKeeper 本地模式安装配置 1.0 在 s101 上进行安 ...

  10. 关于mybatis反向生成为什么有时候实体类会变成两个

    一般来说,将TEXT字段,从一张操作频繁的表中拆分出去,成为一个Key-Value结构的独立表是 好处颇多的. 其有利之处主要体现在下面三个方面: PS:以下的讨论对象均基于Innodb引擎 1. 便 ...