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通信的更多相关文章

  1. Java网络编程UDP通信原理

    前言 继续今天我们的Java网络编程--TCP和UDP通信 一.TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信   TCP UDP 协议名称 传输控制协议 用户数据包协议 是 ...

  2. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  3. java网络编程Socket通信详解

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  4. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  5. java网络编程(TCP详解)

    网络编程详解-TCP 一,TCP协议的特点              面向连接的协议(有发送端就一定要有接收端)    通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小 ...

  6. java网络编程TCP传输—流操作—拿到源后的写入动作

    在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...

  7. Java分享笔记:Java网络编程--TCP程序设计

    [1] TCP编程的主要步骤 客户端(client): 1.创建Socket对象,构造方法的形参列表中需要InetAddress类对象和int型值,用来指明对方的IP地址和端口号. 2.通过Socke ...

  8. JAVA网络编程--UDP通信

    首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑por ...

  9. Java网络编程(TCP客户端)

    TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...

随机推荐

  1. 你绝对想不到R文件找不到(cannot resolve symbol R)的原因

    你绝对想不到R文件找不到(cannot resolve symbol R)的原因 最近在项目开发中 Android Studio 的 R 文件突然找不到了.IDE 中出现了以下提示 cannot re ...

  2. Coordinator节点

    Coordinator节点 Coordinator 节点主要负责segment 的管理和分配.更具体的说,它同通过配置往historical 节点 load 或者 drop  segment .Coo ...

  3. cocos2d-x-Json/XML文件

    数据存储几种方式 1. 数据库 2. 文件 3. 内存 这里介绍Json格式与XML格式的文件存储 常用的文件存储数据的格式 1. Json格式 2. XML格式 Json适合存储小数据,XML适合存 ...

  4. JS属性描述符

    var myObject = { a:2 }; Object.getOwnpropertyDescriptor(myObject,"a"); { value:2, writable ...

  5. Android -- 贝塞尔实现水波纹动画(划重点!!)

    1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...

  6. 玩转SSH端口转发

    SSH有三种端口转发模式,本地端口转发(Local Port Forwarding),**远程端口转发(Local Port Forwarding)**以及**动态端口转发(Dynamic Port ...

  7. vue2-loading-bar 一款基于Vue2的进度条插件

    自学了N久vue,奈何没有练手项目,终于决心拿个东西来试试手.基于对音乐的热爱,选择的第一个demo是音乐播放器.一般播放器都有进度条,于是无意间找到这个插件,就是vue2-loading-bar,这 ...

  8. JAVAEE规范基础知识

    JavaEE规范基础知识 本人博客文章网址:https://www.peretang.com/basic-knowledge-of-javaee-standard/ JavaEE简介 JavaEE,J ...

  9. linux性能之iostat

    在使用linux系统的过程中,总是可能需要当前io性能的状态信息是怎么样?这里就就是一下iostat,可以通过iostat来初步查看io的状态信息. 1.常用方式 iostat -xdk 1 10 或 ...

  10. Composer 中国全量镜像(二)

    一.查看当前镜像地址 在命令行输入如下命令,即可查看镜像地址: $ composer config -g repo.packagist {"type":"composer ...