目录
范例1-1:定义服务器端——主要使用ServerSocket。
第一章:Java网络编程
1.2 开发第一个网络程序
范例1-1:定义服务器端——主要使用ServerSocket。
package com.yootk.demo; 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(9999) ; // 所有的服务器必须有端口 System.out.println("等待客户端连接....."); // 提示信息 Socket client = server.accept() ; // 等待客户端连接 // OutputStream并不方便进行内容的输出,所以利用打印流完成输出 PrintStream out = new PrintStream(client.getOutputStream()) ; out.println("Hello World !"); // 输出数据 out.close(); client.close(); server.close(); } } |
范例1-2:编写客户端——Socket。
· 构造方法:public Socket(String host, int port) throws UnknownHostException, IOException;
|- host表示主机的IP地址,如果是本机直接访问,则使用localhost(127.0.0.1)代替IP;
· 得到输入数据:public InputStream getInputStream() throws IOException。
package com.yootk.demo; import java.net.Socket; import java.util.Scanner; public class HelloClient { public static void main(String[] args) throws Exception { Socket client = new Socket("localhost",9999) ; // 连接服务器端 // 取得客户端的输入数据流对象,表示接收服务器端的输出信息 Scanner scan = new Scanner(client.getInputStream()) ; // 接收服务器端回应数据 scan.useDelimiter("\n") ; // 设置分隔符 if (scan.hasNext()) { // 是否有数据 System.out.println("【回应数据】" + scan.next()); // 取出数据 } scan.close(); client.close(); } } |
1.3 网络开发的经典模型——Echo程序
范例1-3:实现服务器端。
package com.yootk.demo; 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(9999) ; // 定义连接端口 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() ; // 得到客户端发送的内容,并删除空格 if (str.equalsIgnoreCase("byebye")) { // 程序结束标记 out.println("拜拜,下次再会!"); // 输出结束信息 flag = false ; // 退出循环 } else { // 回应输入信息 out.println("ECHO : " + str); // 加“ECHO :”前缀返回 } } } scan.close(); out.close(); client.close(); server.close(); } } |
范例1-4:定义客户端。
package com.yootk.demo; 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", 9999); // 服务器地址与端口 Scanner input = new Scanner(System.in); // 键盘输入数据 // 利用Scanner包装客户端输入数据(服务器端输出),PrintStream包装客户端输出数据; Scanner scan = new Scanner(client.getInputStream()); PrintStream out = new PrintStream(client.getOutputStream()); input.useDelimiter("\n"); // 设置键盘输入分隔符 scan.useDelimiter("\n"); // 设置回应数据分隔符 boolean flag = true; // 循环标志 while (flag) { System.out.print("请输入要发送数据:"); if (input.hasNext()) { // 键盘是否输入数据 String str = input.next().trim(); // 取得键盘输入数据 out.println(str); // 发送数据到服务器端 if (str.equalsIgnoreCase("byebye")) { // 结束标记 flag = false; // 结束循环 } if (scan.hasNext()) { // 服务器端有回应 System.out.println(scan.next()); // 输出回应数据 } } } input.close(); scan.close(); out.close(); client.close(); } } |
范例1-5:修改服务器端。
package com.yootk.demo; 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) { // 创建线程对象时传递Socket this.client = client; } @Override public void run() { try { // 每个线程对象取得各自Socket的输入流与输出流 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(); // 得到客户端发送的内容 if (str.equalsIgnoreCase("byebye")) { // 程序结束 out.println("拜拜,下次再会!"); flag = false; // 退出循环 } else { // 应该回应输入信息 out.println("ECHO : " + str); // 回应信息 } } } scan.close(); out.close(); client.close(); } catch (Exception e) { e.printStackTrace(); } } } public class EchoServer { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(9999); // 在9999端口上监听 boolean flag = true; // 循环标记 while (flag) { // 接收多个客户端请求 Socket client = server.accept(); // 客户端连接 new Thread(new EchoThread(client)).start(); // 创建并启动新线程 } server.close(); } } |