19.网络编程
19.1 介绍
19.2 Socket
Socket—套接字
是网络应用程序编程的接口和一种机制
用套接字中的相关函数来建立连接和完成通信
Socket可以看成在两个程序进行通讯连接中的一个端点
将区分不同应用程序进程的三个参数
- 通信的目的的IP地址
- 使用的传输层协议
- 使用的端口号
与一个socket绑定
利用TCP协议进行通信
- 两个应用程序,有主从之分 一个称为服务器程(Server), 另外一个称为客户机程(Client)
- 交互过程
- 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接
- 客户端程序创建一个socket并请求与服务器建立连接
- 刚才建立了连接的两个socket在一个单独的线程上对话
- 服务器开始等待新的连接请求
19.3 ServerSocket
java
package com.neusoft.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 项目: javaadvice
* 类名: MyServer
* 创建时间: 2020/11/24 13:42
* 描述 : 服务器
* 作者 : 张金山
* QQ : 314649444
* Site: https://jshand.gitee.io
*/
public class MyServer {
public static final int port = 9999;
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(port);
while (true){
System.out.println("server init @ localhost on "+port);
Socket scoket = server.accept();
System.out.println("有新的连接:");
InetAddress address = scoket.getInetAddress();
System.out.println(address.getHostName());
//跟客户端进行交互
InputStream is = scoket.getInputStream();;// 读客户端的信息
OutputStream os = scoket.getOutputStream();// 向客户端写内容
Scanner scanner = new Scanner(System.in);
byte[] bts = new byte[1024];
int len = -1;
System.out.println("等待客户端输入内容:");
while ((len = is.read(bts)) != -1 ){
String info = new String(bts,0,len);
System.out.println("client:"+info);
System.out.print("server:");
String sendInfo = scanner.nextLine();
os.write(sendInfo.getBytes());
os.flush();
if("bye".equals(info) || "bye".equals(sendInfo)){
os.close();
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
19.4 Socket 客户端
java
package com.neusoft.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 项目: javaadvice
* 类名: MyClient
* 创建时间: 2020/11/24 14:25
* 描述 : Socket
* 作者 : 张金山
* QQ : 314649444
* Site: https://jshand.gitee.io
*/
public class MyClient {
public static final String ip = "192.168.85.11";
public static final int port = 6666;
public static void main(String[] args) {
try {
Socket socket = new Socket(ip,port);
InputStream is = socket.getInputStream();;// 读服务端的信息
OutputStream os = socket.getOutputStream();// 向服务端写内容
Scanner scanner = new Scanner(System.in);
byte[] bts = new byte[1024];
int len = -1;
while (true){
System.out.print("client:");
String sendInfo = scanner.nextLine();
os.write(sendInfo.getBytes());
os.flush();
len = is.read(bts);
String info = new String(bts,0,len);
System.out.println("server:"+info);
if("bye".equals(info) || "bye".equals(sendInfo)){
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
19.5 多线程服务器封装
java
package com.neusoft.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* 项目: javaadvice
* 类名: ServerThread
* 创建时间: 2020/11/24 14:43
* 描述 :
* 作者 : 张金山
* QQ : 314649444
* Site: https://jshand.gitee.io
*/
public class ServerThread implements Runnable {
Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("有新的连接:");
InetAddress address = socket.getInetAddress();
System.out.println(address.getHostName());
//跟客户端进行交互
InputStream is = null;
try {
is = socket.getInputStream(); // 读客户端的信息
OutputStream os = socket.getOutputStream();// 向客户端写内容
Scanner scanner = new Scanner(System.in);
byte[] bts = new byte[1024];
int len = -1;
System.out.println("等待客户端输入内容:");
while ((len = is.read(bts)) != -1 ) {
String info = new String(bts, 0, len);
System.out.println("client:" + info);
System.out.print("server:");
String sendInfo = scanner.nextLine();
os.write(sendInfo.getBytes());
os.flush();
if ("bye".equals(info) || "bye".equals(sendInfo)) {
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
java
package com.neusoft.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* 项目: javaadvice
* 类名: MyServer
* 创建时间: 2020/11/24 13:42
* 描述 : 服务器
* 作者 : 张金山
* QQ : 314649444
* Site: https://jshand.gitee.io
*/
public class MyServer {
public static final int port = 9999;
ServerSocket server = null;
public MyServer() {
try {
server = new ServerSocket(port);
System.out.println("server init @ localhost on "+port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
while (true){
Socket socket = null;
try {
socket = server.accept();
new Thread(new ServerThread(socket)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyServer server = new MyServer();
server.start();
}
}
