网络编程,两种方法;使用TCP/IP(性能低,数据较安全) 或 UDP(性能高,数据不安全)
TCP/IP 方式,服务器端(注意使用PrintWriter + OutputStream方法才能刷出数据)
1 package com.imooc.demo.tcpip; 2 3 import java.io.*; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 import java.util.Scanner; 7 8 /** 9 * TCP/IP协议的网络编程 10 * 双向连接 11 * 服务器端 12 */ 13 public class ServerDemo { 14 15 public static void main(String[] args) throws Exception{ 16 Scanner scanner = new Scanner(System.in); 17 System.out.println("服务端准备就绪!"); 18 ServerSocket server = new ServerSocket(8888); 19 Socket client = server.accept(); 20 System.out.println(client+"进入服务器"); 21 InputStream is = client.getInputStream(); 22 BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 23 System.out.println("在服务器这端,接受客户端发送的信息"+reader.readLine()); 24 25 PrintWriter writer = new PrintWriter(client.getOutputStream()); 26 // PrintWriter writer = new PrintWriter(client.getOutputStream(),true);//自动刷 27 writer.println(scanner.nextLine()); 28 writer.flush();//手动刷 29 scanner.close(); 30 writer.close(); 31 reader.close(); 32 is.close(); 33 client.close(); 34 server.close(); 35 } 36 37 }
TCP/IP 方式,客户端
1 package com.imooc.demo.tcpip; 2 3 import java.io.*; 4 import java.net.InetAddress; 5 import java.net.Socket; 6 import java.util.Scanner; 7 8 /** 9 * TCP/IP协议的网络编程 10 * 双向连接 11 * 客户端 12 */ 13 public class ClientDemo { 14 15 public static void main(String[] args)throws Exception { 16 Scanner scanner = new Scanner(System.in); 17 Socket server = new Socket("localhost", 8888); 18 OutputStream os = server.getOutputStream();//socket获取输出流 19 PrintWriter writer = new PrintWriter(os); 20 /** 21 * 使用 BufferedWriter ,无法刷出数据。。。
如何解决?在写完writer.write(数据)后,需要加上write.newLine()方法,表示新启一行后,才会将数据给写出去。 22 * 一直处于等待状态 23 */ 24 // BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os)); 25 writer.println("客户端发送:"+scanner.nextLine()); 26 writer.flush(); 27 BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream())); 28 System.out.println("在客户端这端,接受服务器端发送的信息:"+reader.readLine()); 29 reader.close(); 30 writer.close(); 31 os.close(); 32 server.close(); 33 scanner.close(); 34 } 35 }
示例二:
客户端循环输入,当输入quit结束
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 import java.util.Scanner; 11 12 //客户端 13 public class Client { 14 public static void main(String[] args) { 15 Scanner input = new Scanner(System.in); 16 try { 17 //在new对象的时候,就会建立连接 18 Socket server =new Socket("localhost",6666); 19 20 //接收服务器的数据 21 InputStream in = server.getInputStream(); 22 InputStreamReader isr = new InputStreamReader(in); 23 BufferedReader reader = new BufferedReader(isr); 24 25 //向服务器发送数据 26 OutputStream out = server.getOutputStream(); 27 OutputStreamWriter osw = new OutputStreamWriter(out); 28 BufferedWriter writer = new BufferedWriter(osw); 29 System.out.println("输入要发送到服务器的内容(输入quit结束):"); 30 while (true) { 31 //发送 32 String msg = input.nextLine(); 33 writer.write(msg); 34 writer.newLine(); 35 writer.flush(); 36 37 //接收 38 String serverMsg = reader.readLine(); 39 System.out.println(serverMsg); 40 41 if("quit".equalsIgnoreCase(msg) ){ 42 break; 43 } 44 } 45 46 server.close(); 47 48 } catch (UnknownHostException e) { 49 e.printStackTrace(); 50 } catch (IOException e) { 51 e.printStackTrace(); 52 } 53 } 54 }
服务端
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 //服务端 12 public class Server { 13 public static void main(String[] args) { 14 //端口 15 int port = 10000; 16 try { 17 ServerSocket server = new ServerSocket(port); 18 19 //接收客户端的连接 20 //accept方法会一直等待客户端的连接 21 Socket client = server.accept(); 22 System.out.println(client + "进入服务器"); 23 //获取输出流,用于向客户端写数据 24 OutputStream out = client.getOutputStream(); 25 OutputStreamWriter osw = new OutputStreamWriter(out); 26 BufferedWriter writer = new BufferedWriter(osw); 27 28 //接收客户端的数据 29 InputStream in = client.getInputStream(); 30 InputStreamReader isr = new InputStreamReader(in); 31 BufferedReader reader = new BufferedReader(isr); 32 33 34 while(true){ 35 //接收 36 String msg = reader.readLine(); 37 System.out.println("客户端说:"+ msg); 38 39 //发送 40 writer.write("你发送的消息是:"+msg); 41 writer.newLine(); 42 writer.flush(); 43 44 if("quit".equalsIgnoreCase(msg)){ 45 break; 46 } 47 } 48 49 client.close(); 50 } catch (IOException e) { 51 e.printStackTrace(); 52 } 53 } 54 }