1.Socket通信
网络程序的开发,有着两个核心的类:
服务器类:ServerSocket,主要工作在服务器端,用于接收用户的请求;
客户端类:Socket,每一个连接到服务器上的用户都通过Socket表示;
//定义服务器端——主要使用ServerSocket
//构造方法:
//设置监听端口
public ServerSocket(int port) throws IOException {}
//接收客户端连接:
public Socket accept() throws IOException {}
//取得客户端的输出功能,Socket类定义方法:
public OutputStream getOutputStream() throws IOexception {}
//server
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class HelloServer {
public static void main(String [] args) throws Exception{
ServerSocket server = new ServerSocket(9898); //服务器必须要指定端口
System.out.println("wait for client:......");
Socket client = server.accept(); //等待客户端连接
//OutputStream不方便进行内容的输出,所以利用打印流完成输出
PrintStream out = new PrintStream(client.getOutputStream());
out.println("hello world!");
out.close();
client.close();
server.close();
}
}
//编写客户端——Socket
//构造方法:
public Socket(String host,int port) throws throws UnknownHostException {}
/*
* host代表IP地址,如果是本机范访问可以直接使用localhost(127.0.0.1)代替IP
* port就不用说了,与上面对应
*/
//得到输入数据
public InputStream getInputStream() throws IOException {}
//client
import java.net.Socket;
import java.util.Scanner;
public class HelloClient {
public static void main(String [] args) throws Exception {
Socket client = new Socket("localhost",9898); //链接服务器
//取得客户端的输入数据流对象,表示接收服务器端口的输出信息
Scanner scan = new Scanner(client.getInputStream());
scan.useDelimiter("\n");
if(scan.hasNext()) {
System.out.println("back data:" + scan.next());
}
scan.close();
client.close();
}
}
2.echo通信
echo是一个经典的程序开发模型,本小节简单实现echo程序
//server端
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class EchoServer {
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(9898);
Socket client = server.accept(); //连接客户端
//客户端输入数据以及客户端输出数据的对象
Scanner scan = new Scanner(client.getInputStream());
PrintStream out = new PrintStream(client.getOutputStream());
boolean flag = true; //控制多次接收操作
while (flag) {
if (scan.hasNext()) {
//得到客户端发送的内容
String str = scan.next().trim(); //trim()去掉左右空格
if (str.equalsIgnoreCase("bye")) { //有"bye"时,程序结束
out.println("see you");
flag = false; //退出循环
} else { //应该回应输入信息
out.println("echo:" + str);
}
}
}
scan.close();
out.close();
client.close();
server.close();
}
}
//client端
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class EchoClient {
public static void main(String[] args) throws Exception{
Socket client = new Socket("localhost",9898);
Scanner input = new Scanner(System.in);
Scanner scan = new Scanner(client.getInputStream());
scan.useDelimiter("\n");
input.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream());
boolean flag = true;
while(flag) {
System.out.print("please input data:");
if (input.hasNext()) {
String str = input.next().trim(); //trim()去掉左右空格
out.println(str); //发送服务器端数据
if (str.equalsIgnoreCase("bye")) { //输入"bye"时,程序结束
flag = false; //结束循环
}
if(scan.hasNext()) {
System.out.println(scan.next()); //输出回应数据
}
}
}
input.close();
scan.close();
out.close();
client.close();
}
}
但是普通的Server,是没有办法接收多个客户端的连接的
/*
* 为了可以同时多个客户端,使用多线程
* 把每一个连接到服务器端的客户作为一个独立的线程对象保留
*/
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
class EchoThread implements Runnable {
private Socket client;
public EchoThread(Socket client) {
this.client = client;
}
public void run() {
try {
Scanner scan = new Scanner(client.getInputStream());
PrintStream out = new PrintStream(client.getOutputStream());
boolean flag = true; // 控制多次接收操作
while (flag) {
if (scan.hasNext()) {
// 得到客户端发送的内容
String str = scan.next().trim(); // trim()去掉左右空格
if (str.equalsIgnoreCase("bye")) { // 有"bye"时,程序结束
out.println("see you");
flag = false; // 退出循环
} else { // 应该回应输入信息
out.println("echo:" + str);
}
}
}
scan.close();
out.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class EchoServerThread {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9898);
boolean flag = true;
while(flag) {
Socket client = server.accept(); // 连接客户端
// 客户端输入数据以及客户端输出数据的对象
new Thread(new EchoThread(client)).start();
}
server.close();
}
}