一)Socket & ServerSocket
概述:
1、Socket该类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通讯的端点。
2、ServerSocket类实现了服务器套接字。服务器套接字等待通过网络进入的请求。它根据该请求执行一些操作,然后可能将结果返回给请求者。
初始化构造方法:
1、ServerSocket()
创建未绑定的服务器套接字。
2、ServerSocket(int port)
创建绑定到指定端口的服务器套接字。
3、ServerSocket(int port, int backlog)
创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。
4、ServerSocket(int port, int backlog, InetAddress bindAddr)
创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。
二)服务端
实现步骤:
1、创建一个ServerSocket对象,并绑定一个端口号。
2、通过accept()方法监听ServerSocket,并获取Socket。
3、获取客户端的输入流,并打印到控制台。
4、也可以从服务端写数据,发送到客户端(可选)。
5、关闭Socket和流。
源码实现:
package com.oysept.socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 服务端
* @author ouyangjun
*/
public class MsgServer {
/**
* 初始化服务端ServerSocket
* @return
*/
public ServerSocket initServer() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8765);
return serverSocket;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 监听
* @param serverSocket
*/
public void server(ServerSocket serverSocket) {
Socket socket = null;
InputStream in = null;
BufferedInputStream bufIn = null;
try {
while (true) {
// 监听socket
socket = serverSocket.accept();
// 输入流
in = socket.getInputStream();
// 缓存流
bufIn = new BufferedInputStream(in);
byte[] bytes = new byte[1024];
int b = 0;
while((b = bufIn.read(bytes)) != -1) {
System.out.println("接收到客户端的消息为: " + new String(bytes, 0, b));
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufIn != null) {
bufIn.close();
}
if (in != null) {
in.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MsgServer s = new MsgServer();
s.server(s.initServer()); // 启动服务端
}
}
二)客户端
实现步骤:
1、创建一个Socket对象,并连接到一个端口号(和服务端的端口号一致)。
2、从控制台输入需要发送给服务端的消息。
3、把消息写入到Socket的OutputStream流中。
4、关闭Socket和流。
源码实现:
package com.oysept.socket;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端
* @author ouyangjun
*/
public class MsgClient {
/**
* 初始化客户端Socket
* @return
*/
public void initClient() {
Socket socket = null;
Scanner scanner = null;
OutputStream out = null;
BufferedOutputStream bufOut = null;
try {
socket = new Socket();
socket.connect(new InetSocketAddress("localhost", 8765));
// 控制台输入
scanner = new Scanner(System.in);
String msg = "";
do {
System.out.println("请在控制台输入需要发送给服务端的消息(输入88退出): ");
msg = scanner.next();
// 获取socket的输出流,从客户端向服务端发送消息
out = socket.getOutputStream();
// 缓存流
bufOut = new BufferedOutputStream(out);
bufOut.write(msg.getBytes());
bufOut.flush();
} while (!"88".equals(msg));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufOut != null) {
bufOut.close();
}
if (out != null) {
out.close();
}
if (scanner != null) {
scanner.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MsgClient c = new MsgClient();
c.initClient(); // 启动客户端
}
}
四)Socket功能测试
第一步:先启动服务端。
第二步:启动客户端。
第三步:从客户端发送消息到服务端,截图如下。
服务端控制台界面:
客户端控制台界面:
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!