Java TCP通信
1.Socket原理
1)Socket简介
socket通常称作“套接字”,用于描述IP地址和端口号,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应不同的服务。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务端,Socket是简历网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
2)获取本地地址和端口号
- 获取本地使用的端口号
int getLocalPort()
返回类型为int - 获取套接字绑定的本地地址
InetAddress getLocalAddress()
- 使用InetAddress获取本地的地址方法
String getCanonicaHostName()
返回类型为String - 获取此IP地址的完全限定域名
String getHostAddress()
返回类型为String
3)获取远端地址和端口号
- Socket获取远端端口号方法
int getPort()
返回类型为int - 获取远端套接字绑定的远端地址
InetAddress.getInetAddress()
案例1:Socket获取IP、端口信息
1.设置服务端,以本机作为服务器端演示
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class ServerSocketDemo {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8080); //创建ServerSocket并申请8080服务端口
Socket socket = server.accept(); //阻塞方法,监听服务端口,等待客户端的链接并返回一个socket实例
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.设置客户端,以本机作为客户端演示
客户端设置完成后,先启动服务端,然后启动客户端去连接服务端,连接成功之后可以看到输出本端与远端的IP和端口信息
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket; public class SocketInetAddressDemo {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",8080);
//获取本地使用的端口号
int port = socket.getLocalPort();
System.out.println("本地使用端口号:"+port); InetAddress add = socket.getLocalAddress(); //获取本地地址信息
//使用InetAddress获取本地地址
String hostname = add.getCanonicalHostName();
System.out.println("本地地址:"+hostname);
//获取此IP的完全限定域名
String hostadd = add.getHostAddress();
System.out.println("限定域名:"+hostadd);
//获取远端的端口号
int desPort = socket.getPort();
System.out.println("远端端口号:"+desPort);
//获取远端IP
InetAddress inetAdd = socket.getInetAddress();
System.out.println(inetAdd);
} catch (IOException e) {
e.printStackTrace();
}
}
} /*
运行结果:
本地使用端口号:62565
本地地址:127.0.0.1
限定域名:127.0.0.1
远端端口号:8080
localhost/127.0.0.1
*/
4)获取网络输入流和网络输出流
使用Socket获取输入流与输出流,这两个方法使用Socket通讯的关键方法,封装了TCP协议的Socket是基于流进行通讯的,所以我们在创建了双方连接后,只需要获取相应的输入流与输出流即可实现通讯。
- 返回此套接字的输入流
InputStream getInputStream()
- 返回此套接字的输出流
OutputStream.getOutputStream()
具体代码示例:
public void testSocket() throws Exception{
Socket socket = new Socket("localhost",8080);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
}
5)close方法
当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源。
void close()
2.Socket通讯模型
1)Server端ServerSocket监听
java.net.ServerSocket是运行于服务端应用程序中,通常创建ServerSocket需要指定服务端口号,之后监听Sokcet的连接,监听方法为:
Socket accept()
该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,该Socket封装与表示该客户端的有关的信息,通过这个Socket与该客户端进行通信。
//创建ServerSocket并申请服务端口8080
ServerSocket server = new ServerSocket(8080);
//accept()方法会产生阻塞,直到某个Socket连接并返回请求连接的Socket
Socket socket = server.accept();
2)Client端Socket连接
当服务端ServerSocket调用accept方法阻塞等待客户端连接后,我们可以通过在客户端应用程序中创建Socket来向服务端发起连接。
需要注意的是:创建Socket的同时就发起连接,若连接异常会抛出异常,我们通常创建Socket时会传入服务端的地址以及端口号。
//参数1:服务器的IP地址 参数2:服务端的服务端口号
Socket socket = new Socket("localhost",8080);
3)C/S端通信模型
C/S即:Client-Server,客户端到服务端
客户端与服务端通信模型如下:
- 服务端创建ServerSocket
- 通过调用ServerSocket的accept方法监听客户端的连接
- 客户端创建Socket并指定服务端的地址以及端口来建立与服务端的连接
- 当服务端accept发现客户连接后,获取对应该客户端的Socket
- 双方通过Socket分别获取对应的输入与输出流进行数据通讯
- 通讯结束后关闭连接
Java TCP通信的更多相关文章
- Java TCP通信概念及实例
TCP/UDP 协议 通俗解释: TCP协议和UDP协议的区别类似于电话系统和邮政系统. <1>TCP:类似于电话系统,建立双向的通信通道,确定连接,话音顺序接听. <2>UD ...
- java TCP 通信:服务端与客服端
1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输 ...
- java TCP通信 socket 套接字 用图片上传轰炸服务器
客户端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; import java ...
- TCP通信服务端及客户端代码
Java TCP通信使用的是Socket(客服端)和ServerSocket(服务端),具体代码如下. server端代码: import java.io.BufferedReader; import ...
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示
今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...
- Java网络编程之TCP通信
一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...
随机推荐
- 7.19实习培训日志- java进阶
java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...
- HDU - 4704 sum 大数取余+欧拉降幂
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submi ...
- LeetCode: 598 Range Addition II(easy)
题目: Given an m * n matrix M initialized with all 0's and several update operations. Operations are r ...
- GO:字符串Slice后乱码问题
遇到的问题:用Slice 直接截取字符串的时候会出现乱码现象 package main import ( "fmt" ) func main() { str := "我的 ...
- 小议IT公司的组织架构
IT公司的组织结构还是很相似的,常见的部门也不多.我简单地总结了下,分享给各位.每个公司都有自己独特的组织架构,本文仅供参考.很多部门和职位的职责和权力,我也不甚了解.简单地写写,有兴趣的同学可以补充 ...
- 平衡的阵容 st表学习
模板 预处理 void rmq_isit() { ;i<=n;i++) mx[i][]=mn[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)- ...
- cogs 421. HH的项链
421. HH的项链 http://218.28.19.228/cogs/problem/problem.php?pid=421 ★★★ 输入文件:diff.in 输出文件:diff.out ...
- 18.使用for循环计算+1-3+5-7+9-11+13...99的结果
j = 1 # -1 num1 = 0 #1-3 for i in range(1,100,2): num1 += j * i # -3 j = j * -1 # 1 print(num1) sum1 ...
- Java基础笔记(一)——JDK、JRE、JVM
JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...
- python进阶09 MySQL高级查询
python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...