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 ...
随机推荐
- asp.net core源码飘香:Logging组件
简介: 作为基础组件,日志组件被其他组件和中间件所使用,它提供了一个统一的编程模型,即不需要知道日志最终记录到哪里去,只需要调用它即可. 使用方法很简单,通过依赖注入ILogFactory(Creat ...
- [洛谷P2580]于是他错误的点名开始了
洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> using ...
- three.js提供的几何体
1.简单几何体 three.js提供的稍微简单点的几何体包括有:PlaneGeometry(平面).CircleGeometry(圆形).ShapeGeometry(塑性).CubeGeometry( ...
- 【小瑕疵】在div里插入img后在底部留有缝隙怎么解决
[本文转载自http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html] 图片IMG与容器下边界之间有空隙怎么办?这里介绍3中简单的解决方法. 第一,给图 ...
- 【算法】字符串匹配之Z算法
求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...
- 纯JS单页面赛车游戏代码分享
分享一个以前写的小游戏,纯js游戏,代码很简单.欢迎大家来喷呦! 效果图: 代码展示://直接复制到html文件即可 支持IE9+版本 <!DOCTYPE html> <html&g ...
- [KISSY5系列]KISSY5安装使用(二)
上篇文章,我们遗留的一个问题就是,请求数量有点多,虽然现在的浏览器的请求资源都是并发的.但是我们还是尽量减少请求量. 但是KISSY里面这个问题我们怎么解决呢,其实还是从data-config=&qu ...
- httpd: Could not reliably determine the server's fully qualified domain name
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 问题描述: AH00558: httpd: Could not reliab ...
- codeforces 803B Distances to Zero
Distances to Zero 题目链接:http://codeforces.com/problemset/problem/803/B 题目大意: 给一串数字,求每个数字到离他最近数字0的距离.. ...
- TCP/IP协议精华笔记
1.简介 TCP/IP协议并非单指TCP协议.IP协议,它是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议.ICMP(Internet Control Mes ...