Java 网络编程之 Socket
========================UDP=============================
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。
UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UDPServer {
public static void main(String[] args) {
try {
System.out.println("**服务器已经启动**"); // 指定服务端口号、数据包大小
int serverPort = 8800;
byte[] data = new byte[1024];
// 创建服务端DatagramSocket,并指定端口号
DatagramSocket socket = new DatagramSocket(serverPort); /* UDP数据传输 */
while (true) { /* 处理客户端的请求 */
// 创建数据报DatagramPacket,用于接收客户端发送的数据
DatagramPacket packet = new DatagramPacket(data, data.length);
// 等待客户端的连接请求
socket.receive(packet);
// 获取客户端发送的数据
String content = new String(data, 0, packet.getLength()); /* 服务器处理任务 */
System.out.println("处理需要转置的字符串:" + content);
StringBuffer temp = new StringBuffer().append(content);
// 倒置字符串
content = new String(temp.reverse()); /* 发送服务端响应 */
// 定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int clientPort = packet.getPort();
byte[] reply = content.getBytes();
// 创建数据报,含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(reply, reply.length, address, clientPort);
// 响应客户端
socket.send(packet2);
}
// 关闭资源
// socket.close(); } catch (Exception e) {
e.printStackTrace();
}
}
}
UDPServer.java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner; public class UDPClient {
public static void main(String[] args) {
try { /* 获取用户需要处理的字符串 */
Scanner scanner = new Scanner(System.in);
System.out.print("输入需要倒转的字符串:");
String content = scanner.nextLine(); /* 向服务器发送数据 */
// 定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int clientPort = 8800;
// 将字符串转换为字节数组
byte[] data = content.getBytes();
// 创建数据报,包含发送的数据
DatagramPacket packet = new DatagramPacket(data, data.length, address, clientPort);
// 创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 向服务器发送数据报
socket.send(packet); /* 从服务器获得数据 */
// 创建数据报,用于接收服务器端响应的数据
byte[] reply = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(reply, reply.length);
// 接收服务器相应的数据
socket.receive(packet2);
// 读取字节数组中的数据
content = new String(reply, 0, packet2.getLength());
System.out.println("转置后的结果为:" + content); /* 关闭资源 */
socket.close();
scanner.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
UDPClient.java
服务端输出:
**服务器已经启动**
处理需要转置的字符串:JavaScript 客户端输出:
输入需要倒转的字符串:JavaScript
转置后的结果为:tpircSavaJ
========================TCP==============================
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。
当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer {
public static void main(String[] args) {
try {
System.out.println("**服务器已经启动**"); // 创建服务器Socket,并填写端口号
ServerSocket serverSocket = new ServerSocket(8888); /* TCP数据传输 */
while (true) { /* 处理客户端的请求 */
// 调用accept()方法监听客户端连接
Socket socket = serverSocket.accept();
// 从客户端接收内容
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
// 将响应内容存入字符串中
String data = null;
StringBuffer content = new StringBuffer();
do {
if (data != null) {
content.append(data);
}
} while ((data = reader.readLine()) != null);
// 关闭输入流
socket.shutdownInput(); /* 服务器处理任务 */
System.out.println("处理需要转置的字符串:" + content);
// 倒置字符串
content = content.reverse(); /* 发送服务端响应 */
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.write(new String(content));
writer.flush();
// 关闭输出流
socket.shutdownOutput(); /* 关闭资源 */
reader.close();
isr.close();
is.close();
writer.close();
os.close();
socket.close();
} /* 关闭Socket */
// serverSocket.close(); } catch (Exception e) {
e.printStackTrace();
}
}
}
TCPServer.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner; public class TCPClient {
public static void main(String[] args) {
try { // 创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost", 8888); /* 获取用户需要处理的字符串 */
Scanner scanner = new Scanner(System.in);
System.out.print("输入需要倒转的字符串:");
String content = scanner.nextLine(); /* 向服务器发送数据 */
// 将数据以输出流形式发送
OutputStream os = socket.getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.write(content); // 写入数据
writer.flush(); // 刷新缓存
// 关闭输出流
socket.shutdownOutput(); /* 从服务器获得数据 */
// 将数据以输入流形式获取
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
/* 将响应内容存入字符串中 */
String data = null;
StringBuffer buffer = new StringBuffer();
do {
if (data != null) {
buffer.append(data);
}
} while ((data = reader.readLine()) != null);
// 关闭输入流
socket.shutdownInput();
System.out.println("转置后的结果为:" + buffer); /* 关闭资源 */
writer.close();
os.close();
socket.close();
reader.close();
isr.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCPClient.java
服务端输出:
**服务器已经启动**
处理需要转置的字符串:Android 客户端输出:
输入需要倒转的字符串:Android
转置后的结果为:diordnA
Java 网络编程之 Socket的更多相关文章
- java网络编程之Socket编程
概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...
- java网络编程之socket
网络编程是什么 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据. ...
- java网络编程之socket(1)
网络编程是什么 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据. ...
- java 网络编程之Socket编程
1.客户端代码 1 package com.gylhaut.socket; 2 3 import java.io.BufferedReader; 4 import java.io.IOExcept ...
- java网络编程之socket(2)
异步处理多客户端连接服务端 上篇讲到的是服务端接收一个客户端的请求之后就结束了,不能再接收其他客户端的请求了,实际情况上我们希望服务端能够处理来自不同用户的请求. 想到这里,或许我们可以用一个死循环, ...
- 网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
随机推荐
- AutoCAD2006的安装及CASS7.1的配置破解
-----本文只限于学习交流,商业用途请支持正版! -----转载请注明:http://www.cnblogs.com/mxbs/p/6193190.html 准备: AutoCAD2006.CASS ...
- Jenkins学习四:Jenkins 邮件配置
本文主要对Windows环境 jenkins 的邮件通知进行介绍 jenkins 内置的邮件功能 使用email-ext插件扩展的邮件功能 邮件通知功能主要包含两个部分:全局配置和项目配置. 一. 先 ...
- jdbc java数据库连接 2)jdbc接口核心的API
JDBC接口核心的API java.sql.* 和 javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...
- em(倍)与px的区别
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...
- C#基础系列——一场风花雪月的邂逅:接口和抽象类
前言:最近一个认识的朋友准备转行做编程,看他自己边看视频边学习,挺有干劲的.那天他问我接口和抽象类这两个东西,他说,既然它们如此相像, 我用抽象类就能解决的问题,又整个接口出来干嘛,这不是误导初学者吗 ...
- C#反射在ADO中的巧用
在C#原生开发网站的时候,经常会碰到一个问题,后台用原生查出来的数据一般是DataReader或者是DataTable,这样就把数据从数据库中拿到了,然后就是把数据绑定到前台页面进行输出,这是最原生态 ...
- 【转】解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介
ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一个.NET Core的东 ...
- 84 tune2fs-调整系统参数
tune2fs命令允许系统管理员调整"ext2/ext3"文件系统中的可该参数.Windows下面如果出现意外断电死机情况,下次开机一般都会出现系统自检.Linux系统下面也有文件 ...
- html盒子模型
http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html
- JavaMail简单版实验测试
前言: 最近由于实现web商城的自动发送邮件功能的需求,故涉猎的邮箱协议的内部原理.现将简单版的Java Mail实例做个代码展示,并附上其中可能出现的bug贴出,方便感兴趣的读者进行测试! 1.载入 ...