6.Java Socket基础编程
Socket分为两种:
服务器ServerSocket和普通Socket,其中服务器Socket用于接收客户端的连接,一般来说,一个服务器套接字可以被多个普通套接字连接。
1.创建服务器ServerSocket等待连接Demo
package InternetCode.Socket.Exa6_1;
import java.net.*;
import java.util.Arrays;
public class ServerSocketDemo {
//声明ServerSocket对象
private ServerSocket server;
//声明Socket对象socket
private Socket socket;
public void getServer() {
try {
// 根据端口号实例化服务器Socket对象
server = new ServerSocket(1978);
System.out.println("服务器套接字已经创建成功\n");
//循环等待套接字连接
while (true) {
System.out.println("等待客户机的连接......\n");
socket = server.accept();
System.out.println(socket.getInetAddress().getHostAddress() +"连接成功......\n");
}
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}
// 主方法
public static void main(String[] args) {
// 创建本类对象
ServerSocketDemo frame = new ServerSocketDemo();
// 调用方法创建服务器套接字
frame.getServer();
}
}
2.普通Socket连接服务端Demo
package InternetCode.Socket.Exa6_1;
import java.net.Socket;
public class ClientSocketDemo {
// 声明Socket对象
private Socket socket;
/**
* 连接套接字方法
*/
private void connect() {
System.out.println("尝试连接......\n");
try {
// 实例化Socket对象
socket = new Socket("127.0.0.1", 1978);
System.out.println("完成连接。\n");
} catch (Exception e) {
e.printStackTrace();
}
}
// 主方法
public static void main(String[] args) {
// 创建本例对象
ClientSocketDemo clientSocketDemo = new ClientSocketDemo();
// 调用连接方法
clientSocketDemo.connect();
}
}
3.设置服务器等待连接超时时间
package InternetCode.Socket.Exa6_1;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.SocketTimeoutException;
/**
* 设置服务器等待连接的超时时间
*/
public class ServerTimeOutSet {
private ServerSocket server; // 声明ServerSocket对象
public void getServer() {
try {
server = new ServerSocket(1978); // 实例化Socket对象
// 设置连接超时时间为10秒 ,执行accept后10秒后若没有客户端连接,则抛出异常
server.setSoTimeout(5000);
// 输出信息
System.out.println("服务器套接字已经创建成功\n");
while (true) {
//输出信息
System.out.println("等待客户机的连接......\n");
// 等待客户机连接
server.accept();
}
} catch (SocketTimeoutException e) {
System.out.println("连接超时......");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 创建本类对象
ServerTimeOutSet frame = new ServerTimeOutSet();
// 调用方法
frame.getServer();
}
}
这个程序主要加上了设置连接超时的时间。
4.获取远程连接套接字的ip和端口号
客户端:
package InternetCode.Socket.Exa6_2;
import java.net.*;
/**
* 获取远程连接套接字的ip和端口号
*/
public class ClientSocketFrame {
// 声明Socket对象
private Socket socket;
/**
* 连接套接字方法
*/
private void connect() {
System.out.println("尝试连接......\n");
try {
// 客户端根据ip和端口号尝试创建socket时,
// 其实就是建立一个tcp连接
//如果创建成功则是连接成功
socket = new Socket("127.0.0.1", 1978);
System.out.println("完成连接。\n");
// 获得远程服务器的地址
InetAddress netAddress = socket.getInetAddress();
// 获得远程服务器的IP地址
String netIp = netAddress.getHostAddress();
// 获得远程服务器的端口号
int netPort = socket.getPort();
// 获得客户端的地址
InetAddress localAddress = socket.getLocalAddress();
// 获得客户端的IP地址
String localIp = localAddress.getHostAddress();
// 获得客户端的端口号
int localPort = socket.getLocalPort();
System.out.println("远程服务器的IP地址:" + netIp + "\n");
System.out.println("远程服务器的端口号:" + netPort + "\n");
System.out.println("客户机本地的IP地址:" + localIp + "\n");
System.out.println("客户机本地的端口号:" + localPort + "\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ClientSocketFrame client = new ClientSocketFrame();
client.connect();
}
}
服务端:
package InternetCode.Socket.Exa6_2;
import java.net.*;
/**
* 获取远程连接套接字的ip和端口号
*/
public class ServerSocketFrame{
// 声明ServerSocket对象
private ServerSocket server;
// 声明Socket对象socket
private Socket socket;
public void getServer() {
try {
// 实例化Socket对象
server = new ServerSocket(1978);
// 输出信息
System.out.println("服务器套接字已经创建成功\n");
while (true) {
// 输出信息
System.out.println("等待客户机的连接......\n");
// 等待连接
socket = server.accept();
System.out.println("连接成功......\n");
System.out.println("连接的客户端ip为:"+socket.getInetAddress().getHostAddress());
System.out.println("连接的客户端的端口号为: "+socket.getPort());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ServerSocketFrame frame = new ServerSocketFrame();
frame.getServer();
}
}
代码地址:
作者:small-water
出处:https://www.cnblogs.com/small-water/p/17870093.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
Java动手做一做之网络编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!