JAVA网络编程TCP通信
Socket简介:
Socket称为“套接字”,描述IP地址和端口。在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务。Socket和ServerSocket类位于java.net包中。ServerSocket用于服务端,Socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话。
Socket常用方法:
-int getLocalPort() 获取本地使用的端口号
-InetAddress getLocalAddress() 获取套接字绑定的本地地址
-int getPort() 获取远端使用的端口号
-InetAddress.getInetAddress() 获取套接字绑定的远端地址
InetAddress常用方法:
-String getCanonicalHostName() 获取此IP地址的完全限定域名。
-String getHostAddress() 返回IP地址字符串
//获取本地地址和端口号:
public void testSocket() throws Exception{
Socket socket=new Socket("localhost",8088);
InetAddress add=socket.getLocalAddress();
System.out.println(add.getCanonicalHostName());
System.out.println(add.getHostName());
System.out.println(add.getLocalPort());
8 }
//获取远端地址和端口号:
public static void testSocket() throws Exception{
Socket socket=new Socket("localhost",8088);
InetAddress inetAdd=socket.getInetAddress();
System.out.println(inetAdd.getCanonicalHostName());
System.out.println(inetAdd.getHostName());
System.out.println(socket.getLocalPort());
}
其他方法的使用:
package com.demo.inet; import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays; public class InetAddressDemo {
public static void main(String[] args) {
// 创建一个字节数组byte 127 ~ -128
byte bt[] = {-64,-88,3,44};//192.168.3.44 try {
// 创建InetAddress对象
InetAddress id = InetAddress.getByAddress(bt);
System.out.println(id);
// 返回原始IP地址
byte[] bs = id.getAddress();
System.out.println(Arrays.toString(bs));
// 返回对象对应IP地址
System.out.println(id.getHostAddress());
// 返回全名计算名称
System.out.println(id.getCanonicalHostName()+"------------------"); // 返回本机计算机名及对应ip地址
System.out.println(InetAddress.getLocalHost()); // 返回host名称对应域名及ip地址
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
System.out.println(Arrays.toString(allByName));
System.out.println(allByName[0].getHostName()); // 域名
System.out.println(allByName[0].getHostAddress()); // ip地址 // 同主机名称获取IP信息
InetAddress addr = InetAddress.getByName("localhost");
System.out.println(addr.getHostAddress());
System.out.println(addr.getCanonicalHostName()); // 返回ip地址
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
获取网络输入流和网络输出流
通过Socket获取输入流与输出流,主要使用一下两个方法
-InputStream getInputStream() 用于返回此套接字的输入流
-OutStream getOutputStream() 用于返回此套接字的输出流
public static void testSocket() throws Exception {
Socket socket = new Socket("localhost", 8088);
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
PrintWriter pw = new PrintWriter(osw, true);
pw.println("输出的内容");//发送内容
InputStream in=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in, "UTF-8");
BufferedReader br=new BufferedReader(isr);
br.readLine();//读取接到的内容
}
注意:当使用完Socket进行通讯完毕后,要关闭Socket以释放系统资源
-void close() 关闭套接字,同时也代表关闭了获取的输入与输出流。
服务端ServerSocket监听
//创建ServerSocket并申请服务端口8088
ServerSocket server=new ServerSocket(8088);
/*方法会产生阻塞,直到某个Socket连接,并返回请求连接的Socket*/
Socket socket=server.accept();
...
客户端Socket连接
//参数1:服务端的IP地址,参数2:服务端的服务器端口
//注意:创建Socket的同时就会发起连接,若连接失败会抛出异常
Socket socket=new Socket("localhost",8088);
....
C-S端通信模型
详细实例演示
Server:
package com.demo.server; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class Server { static int port = 12345; public static void main(String[] args) {
// 创建服务端Socket对象
ServerSocket serverSocket = null;
while (true) {
try {
// 创建服务端Socket对象
serverSocket = new ServerSocket(port);
System.out.println("等待客户端连接服务器.......");
// 阻塞服务器
Socket socket = serverSocket.accept();
System.out.println("客户端连接到服务器......."); // 创建文件输出流
BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream());
os.write("服务器端: 我收到了客户端连接请求。".getBytes());
os.flush();
os.close(); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }
Client:
package com.demo.client; import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.Socket; public class Client {
static int port = 12345;
static String host = "111.231.93.134"; public static void main(String[] args) {
// 创建客户端对象
Socket socket = null;
try {
// 创建客户端对象
socket = new Socket(host, port); // 获取输入流对象
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
// 定义缓冲字节数组
byte[] buffer = new byte[1024];
// 定义接收实际长度
int len = 0;
while ((len = bis.read(buffer)) != -1) {
String content = new String(buffer, 0, len);
System.out.println("客户端接收的内容:"+content);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP与UDP的区别
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。聊天工具使用TCP协议
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! 游戏多使用UDP协议
UDP程序演示:
Server:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /*
* 服务器端,实现基于UDP的用户登陆
*/
public class UDPServer {
public static void main(String[] args) throws IOException {
/*
* 接收客户端发送的数据
*/
// 1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
// 2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
// 3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
// 4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info); /*
* 向客户端响应数据
*/
// 1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".getBytes();
// 2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.响应客户端
socket.send(packet2);
// 4.关闭资源
socket.close();
}
}
Client:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /*
* 客户端
*/
public class UDPClient {
public static void main(String[] args) throws IOException {
/*
* 向服务器端发送数据
*/
// 1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用户名:admin;密码:123".getBytes();
// 2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 4.向服务器端发送数据报
socket.send(packet); /*
* 接收服务器端响应的数据
*/
// 1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收服务器响应的数据
socket.receive(packet2);
// 3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
// 4.关闭资源
socket.close();
}
}
JAVA网络编程TCP通信的更多相关文章
- Java网络编程UDP通信原理
前言 继续今天我们的Java网络编程--TCP和UDP通信 一.TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCP UDP 协议名称 传输控制协议 用户数据包协议 是 ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- java网络编程(TCP详解)
网络编程详解-TCP 一,TCP协议的特点 面向连接的协议(有发送端就一定要有接收端) 通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...
- Java分享笔记:Java网络编程--TCP程序设计
[1] TCP编程的主要步骤 客户端(client): 1.创建Socket对象,构造方法的形参列表中需要InetAddress类对象和int型值,用来指明对方的IP地址和端口号. 2.通过Socke ...
- JAVA网络编程--UDP通信
首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑por ...
- Java网络编程(TCP客户端)
TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...
随机推荐
- 基于MVC和Bootstrap的权限框架解决方案 一.搭建HTML
因为某些原因,因为需要,最新要做一套客户管理系统,但是不满足于仅有的框架. 看了很多大牛写的框架,强大是强大,代码也太TM多了,乱七八糟话不多说,开始吧 随便在网上找到一套好看的HTML,看起来还不错 ...
- 用 Python 编写剪刀、石头、布的小游戏(快速学习python语句)
import random#定义手势类型allList = ['石头','剪刀','布']#定义获胜的情况winList = [['石头','剪刀'],['剪刀','布'],['步','石头']]pr ...
- 一次young gc耗时过长优化过程
1 问题源起 上游系统通过公司rpc框架调用我们系统接口超时(默认超时时间为100ms)数量从50次/分突然上涨到2000次/分,在发生变化时间段里我们的系统也没有做过代码变更,但上游系统的调用 ...
- js继承之原型链方式实现
温故而知新: 在之前的文章已经重点了解了原型对象,今天就理一理这个原型对象在原型链式的继承中的使用 function a(x,y){this.x=x;this.y=y;} //定义一个函数,当构造函数 ...
- iOS·UIKit框架注解 & Foundation
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- JSON 解析工具的封装(Java)
JSON 解析工具的封装(Java) 一直想有一个属于自己的JSON工具,今天终于弄好了..... 1.添加pom依赖包 <!--json解析--> <dependency> ...
- 初学Log4Net
1.Log4Net是什么? Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等) 2.Appender Appende ...
- Python数据结构与循环语句
# Python数据结构与循环语句: 首先编程是一项技能,类似跑步,期初不必在意细节,能使用起来就行,等学的游刃有余了再回过头来关注细节问题也不迟. 关于买书: 学会python之后,才需要买书 ...
- FrameBuffer系列 之 简单编程
一.Linux的帧缓冲设备 帧缓冲(framebuffer)是 Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.这种操作是抽象的 ...