标签:
一、Socket是什么:
Socket是连接运行在网络上的两个程序间的双向通讯的端点。
为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。
二、使用Socket进行网络通信的过程:
1.服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。
2.客户程序根据服务器程序所在的主机名和端口号发出连接请求。
3.如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。
4.客户和服务器通过读、写套接字进行通讯。
三、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信总结:
1.建立Socket连接
2. 获得输入/输出流
3.读/写数据
4.关闭输入/输出流
5. 关闭Socket
Server端
1 import java.net.ServerSocket; 2 import java.net.Socket; 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.OutputStreamWriter; 9 import java.io.PrintWriter; 10 11 /* 12 * 基于TCP协议的Socket通信,实现用户登陆 13 * 服务器端 14 */ 15 public class Server { 16 public static void main(String[] args) { 17 try { 18 // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 19 ServerSocket serverSocket = new ServerSocket(8888); 20 Socket socket = null; 21 System.out.println("服务器启动"); 22 23 // 监听等待客户端的连接 24 socket = serverSocket.accept(); 25 26 InputStream is = socket.getInputStream(); 27 InputStreamReader isr = new InputStreamReader(is); 28 BufferedReader br= new BufferedReader(isr); 29 30 String a; 31 while ((a = br.readLine()) != null) { 32 System.out.println("用户信息:" + a); 33 } 34 35 OutputStream os = socket.getOutputStream(); 36 OutputStreamWriter osw=new OutputStreamWriter(os); 37 //osw.write("asd"); 38 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 39 pw.write("welcome"); 40 pw.flush(); 41 42 osw.close(); 43 os.close(); 44 br.close(); 45 isr.close(); 46 is.close(); 47 48 socket.close(); 49 serverSocket.close(); 50 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 } 55 }
Client端
1 package test_1; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 import java.net.UnknownHostException; 11 12 /* 13 * 客户端 14 */ 15 public class Client { 16 public static void main(String[] args) { 17 try { 18 //创建客户端Socket,指定服务器地址和端口 19 Socket socket=new Socket("localhost", 8888); 20 //获取输出流,向服务器端发送信息 21 OutputStream os=socket.getOutputStream();//字节输出流 22 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 23 pw.write("用户名:alice;密码:789"); 24 pw.flush(); 25 socket.shutdownOutput();//关闭输出流 26 //获取输入流,并读取服务器端的响应信息 27 InputStream is=socket.getInputStream(); 28 BufferedReader br=new BufferedReader(new InputStreamReader(is)); 29 String info=null; 30 while((info=br.readLine())!=null){ 31 System.out.println("我是客户端,服务器说:"+info); 32 } 33 //4.关闭资源 34 br.close(); 35 is.close(); 36 pw.close(); 37 os.close(); 38 socket.close(); 39 } catch (UnknownHostException e) { 40 e.printStackTrace(); 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 } 45 }
多线程的Server端:
1 package test_1; 2 3 import java.net.InetAddress; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 import java.io.IOException; 7 8 /* 9 * 基于TCP协议的Socket通信,实现用户登陆 10 * 服务器端 11 */ 12 public class Server { 13 public static void main(String[] args) { 14 try { 15 // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 16 ServerSocket serverSocket = new ServerSocket(8888); 17 Socket socket = null; 18 System.out.println("服务器启动"); 19 20 while(true){ 21 // 监听等待客户端的连接 22 socket = serverSocket.accept(); 23 24 Serverthread serverthread=new Serverthread(socket); 25 26 serverthread.start(); 27 InetAddress address=socket.getInetAddress(); 28 System.out.println("当前客户端的IP:"+address.getHostAddress()); 29 } 30 31 32 } catch (IOException e) { 33 e.printStackTrace(); 34 } 35 } 36 } 37 38 39 package test_1; 40 41 import java.io.BufferedReader; 42 import java.io.IOException; 43 import java.io.InputStream; 44 import java.io.InputStreamReader; 45 import java.io.OutputStream; 46 import java.io.OutputStreamWriter; 47 import java.io.PrintWriter; 48 import java.net.Socket; 49 50 public class Serverthread extends Thread{ 51 Socket socket=null; 52 53 public Serverthread(Socket socket) { 54 this.socket=socket; 55 } 56 57 public void run() { 58 try { 59 InputStream is = socket.getInputStream(); 60 InputStreamReader isr = new InputStreamReader(is); 61 BufferedReader br= new BufferedReader(isr); 62 63 String a; 64 while ((a = br.readLine()) != null) { 65 System.out.println("用户信息:" + a); 66 } 67 68 OutputStream os = socket.getOutputStream(); 69 OutputStreamWriter osw=new OutputStreamWriter(os); 70 //osw.write("asd"); 71 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 72 pw.write("welcome"); 73 pw.flush(); 74 75 osw.close(); 76 os.close(); 77 br.close(); 78 isr.close(); 79 is.close(); 80 81 socket.close(); 82 } catch (IOException e) { 83 // TODO 自动生成的 catch 块 84 e.printStackTrace(); 85 } 86 87 }; 88 }
标签:
原文地址:http://www.cnblogs.com/daneres/p/4670735.html