Java网络编程Socket通信
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP (User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
TCP与UDP基本区别
- 1.基于连接与无连接
- 2.TCP要求系统资源较多,UDP较少;
- 3.UDP程序结构较简单
- 4.流模式(TCP)与数据报模式(UDP);
- 5.TCP保证数据正确性,UDP可能丢包
- 6.TCP保证数据顺序,UDP不保证
一、Tcp协议通信
1、Server服务器端:
- a、创建ServerSocket对象,同时绑定监听端口
- b、通过accept()方法监听客户端的请求
- c、建立连接后,通过输入流读取客户端发送的请求信息
- d、通过输出流向客户端发送响应信息
- e、关闭相应资源
package com.yyx.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TcpServerSocket {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
FileOutputStream fileOutputStream = null;
try {
// 创建一个ServerSocket的对象,通过构造器指明自身的端口号
serverSocket = new ServerSocket(9090);
// 服务端监听 调用其accept()方法,返回一个Socket的对象
socket = serverSocket.accept();
inputStream = socket.getInputStream(); String pathname = "F:" + File.separator + "target.jpg";
File file = new File(pathname);
fileOutputStream = new FileOutputStream(file); /*
* 接收客户端发送文件,并保存到本地文件
*/
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) != -1) {
fileOutputStream.write(b, 0, len);
} String strInfo = "你发送的图片我已接收成功!";
outputStream = socket.getOutputStream();
outputStream.write(strInfo.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭相应的流以及Socket、ServerSocket的对象
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
}
2、Client客户端:
- a、创建Socket对象,指明需要连接的服务器的地址和端口号
- b、建立连接后,通过输出流向服务器端发送请求信息
- c、通过输入流获取服务器的响应信息
- d、关闭相应资源
package com.yyx.test; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket; public class TcpClientSocket {
public static void main(String[] args) {
Socket socket = null;
OutputStream outputStream = null;
InputStream inputStream = null;
FileInputStream fileInputStream=null;
try {
// 创建一个Socket的对象,通过构造器指明服务端的IP地址,以及其接收程序的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090); String pathname = "F:" + File.separator + "source.jpg";
File file = new File(pathname);
fileInputStream=new FileInputStream(file); // getOutputStream():发送数据,方法返回OutputStream的对象
outputStream = socket.getOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = fileInputStream.read(b)) != -1) {
outputStream.write(b, 0, len);
} // shutdownOutput():执行此方法,显式的告诉服务端发送完毕!
socket.shutdownOutput(); inputStream = socket.getInputStream();
byte[] bAnother = new byte[1024];
int lenAnother;
while ((lenAnother = inputStream.read(bAnother)) != -1) {
String str = new String(bAnother, 0, lenAnother);
System.out.print(str);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭相应的流和Socket对象,从后往前关闭
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二、Udp协议通信
客户端
package com.yyx.test; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UdpClientSocket {
public static void main(String[] args) {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
String str = "你好,我是要发送的数据";
byte[] b = str.getBytes(); /*
* 创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到 的接收端的IP、端口号
*/
DatagramPacket pack = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"), 9090); datagramSocket.send(pack);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (datagramSocket != null) {
datagramSocket.close(); }
}
}
}
服务端
package com.yyx.test; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UdpServerSocket {
public static void main(String[] args) {
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(9090);
byte[] b = new byte[1024];
DatagramPacket pack = new DatagramPacket(b, 0, b.length);
datagramSocket.receive(pack); String str = new String(pack.getData(), 0, pack.getLength());
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (datagramSocket != null) {
datagramSocket.close(); }
}
}
}
Java网络编程Socket通信的更多相关文章
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
- Java网络编程——Socket
网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通 ...
- Java网络编程UDP通信原理
前言 继续今天我们的Java网络编程--TCP和UDP通信 一.TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCP UDP 协议名称 传输控制协议 用户数据包协议 是 ...
- day05 Java网络编程socket 与多线程
java网络编程 java.net.Socket Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的 ...
- JAVA网络编程Socket常见问题 【长连接专题】
一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...
- UNIX网络编程——Socket通信原理和实践
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...
- java网络编程——socket实现简单的CS会话
还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import ja ...
随机推荐
- 浅析 JavaScript 中的闭包(-------------------------------------------)
一.前言 对于 JavaScript 来说,闭包是一个非常强大的特征.但对于刚开始接触的初学者来说它又似乎是特别高深的.今天我们一起来揭开闭包的神秘面纱.闭包这一块也有很多的文章介绍过了,今天我就浅谈 ...
- 简单了解HTML5中的Web Notification桌面通知
原文:http://www.zhangxinxu.com/wordpress/2016/07/know-html5-web-notification/ 需要注意的是,消息通知只有通过Web服务访问该页 ...
- vdWebControl.js去水印
vdWebControl.js可以在浏览器中展示cad图形(须要使用其自家的转换工具把cad转换为vds格式.工具免费,但转换完成后的文件带水印信息),支持编辑图形. vdWebControl.js试 ...
- Toolbar的使用.md
1.什么是Toolbar Toolbar是在Android5.0时出现的一个新控件,其目的用于取代Actionbar,它与Actionbar最大的差别就是Toolbar使用更加灵活.自由,而且Tool ...
- C++11 并发指南三(std::mutex 详解)(转)
转自:http://www.cnblogs.com/haippy/p/3237213.html 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::th ...
- Solaris分布式文件系统NFS
NFS存在的意思是让不同unix系统之间可以传输数据.这样可以合理的利用资源. 对每一个系统,建立一个NFS文件系统,进行数据的备份. NFS守护进程: nfsd mountd locked st ...
- CrtmpServr 接收Http流程
最近在研究CrtmpServer http部分,记录一些基本的流程,以备查阅. 首先,打开配置脚本CrtmpServer.lua ,确认脚本中有以下内容,如果没有需要加上. { name=" ...
- C++入门一
C++ 项目结构 Resource Files: 项目引用的位图文件,图标,窗口,光标等.比如,你的程序要生成一个exe文件,而文件的图标是你自定义的图标,那就要在这个工程里面添加Icon资源,添加一 ...
- Logistic Regression 笔记与理解
Logistic Regression 笔记与理解 Logistic Regression Hypothesis 记为 H(theta) H(theta)=g(z) 当中g(z),是一个叫做Logis ...
- kubernetes对象之Ingress
系列目录 概述 向外网暴露集群内服务,以使客户端能够访问,有以下几种方法,本文重点描述Ingress. LoadBalancer LoadBalancer一般由云服务供应商提供或者用户自定义,运行在集 ...