网络编程Socket
网络基础知识
IP:标识每台计算机
端口:标识一台计算机上的每个应用程序 端口范围:0~65535 ,一般编程使用1023以上的 端口号;0~1023的端口被系统所保留
协议:计算机之间的语言
InetAdress
此类表示互联网协议 (IP) 地址。
此类无构造函数,只能通过静态方法构造实例
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAdressDemo { public static void main(String[] args) { try { InetAddress as=InetAddress.getLocalHost(); System.out.println(as.getHostAddress()); //输出本机地址 System.out.println(as.getHostName()); //输出本机名 } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
URL
URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.net.MalformedURLException; 5 import java.net.URL; 6 7 public class URLDemo { 8 public static void main(String[] args) { 9 try { 10 URL url = new URL("http://www.baidu.com"); 11 java.io.InputStream is =url.openStream(); 12 13 InputStreamReader inz=new InputStreamReader(is,"utf-8"); 14 BufferedReader inzi=new BufferedReader(inz); 15 String data=inzi.readLine(); 16 while(data!=null){ 17 System.out.print(data); 18 data=inzi.readLine(); 19 } 20 inzi.close(); 21 is.close(); 22 inz.close(); 23 }catch (MalformedURLException e) { 24 e.printStackTrace(); 25 } catch (IOException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 } 30 }
通过Socket实现TCP编程
主要用到两个类:ServerSocket Socket
package tx; /* * 多用户登录服务器端 * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class fuwuduan { public static void main(String[] args) { try { //定义服务器端口 ServerSocket fwq=new ServerSocket(8888); while(true){ System.out.println("***********服务器等在客户端的连接********"); Socket ss = fwq.accept();//阻塞等待客户端连接 //启动线程 xc cc=new xc(ss); Thread aa=new Thread(cc); aa.setPriority(4);//设置线程优先级,提高程序效率,默认值为5;范围0~10 aa.start(); try { aa.join(); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // fwq.close(); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } }
线程:
package tx; /* * 线程,实现多客户连接 * * */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class xc implements Runnable { Socket ss; public xc(Socket ss) { super(); this.ss = ss; } public void run() { try { System.out.println("服务器连接成功----^-^"); //服务器接收客户端发来的信息 java.io.InputStream inputstream=ss.getInputStream(); InputStreamReader inputStreamreader=new InputStreamReader(inputstream); BufferedReader bf=new BufferedReader( inputStreamreader); String sd=null; while((sd=bf.readLine()) != null){ System.out.println("客户端发来了:"+sd); } //服务器向客户端发送信息 java.io.OutputStream in=ss.getOutputStream(); OutputStreamWriter ou=new OutputStreamWriter(in); PrintWriter pt=new PrintWriter(ou); pt.write("我已收到你发来的信息!"); pt.flush(); //关闭资源 ss.shutdownInput(); ss.shutdownOutput(); inputstream.close(); inputStreamreader.close(); pt.close(); ou.close(); in.close(); bf.close(); ss.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端:
package tx; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class khd { public static void main(String[] args) { try { Socket socket=new Socket("127.0.0.1",8888);//127.0.0.1表示本地主机地址;等同于"localhost" //客户端向服务器发送信息 java.io.OutputStream in=socket.getOutputStream(); OutputStreamWriter ou=new OutputStreamWriter(in); PrintWriter pt=new PrintWriter(ou); pt.write("用户名:admin2,密码:12345"); pt.flush(); socket.shutdownOutput(); //客户端接收服务器发来的消息 java.io.InputStream inputstream=socket.getInputStream(); InputStreamReader inputStreamreader=new InputStreamReader(inputstream); BufferedReader bf=new BufferedReader( inputStreamreader); String sd=null; while((sd=bf.readLine()) != null){ System.out.println("服务器发来了---------》"+sd); } socket.shutdownInput(); inputstream.close(); inputStreamreader.close(); pt.close(); pt.close(); ou.close(); in.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
基于Socket的DUP编程
主要用到的两个类:
Datagrampacket:
此类表示数据报包。
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
DatagramSocket:此类表示用来发送和接收数据报包的套接字。
实例应用:
用户登录案例:
服务器端:
package DUPDemo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class fuwuqi { public static void main(String[] args) throws IOException { DatagramSocket socket =new DatagramSocket(8800); byte[] buf=new byte[1024]; DatagramPacket packet=new DatagramPacket(buf, buf.length); System.out.println("****服务器正在等待客户端连接*******"); socket.receive(packet); System.out.println("****客户端连接成功"); String string=new String(buf); System.out.println("客户端发来的信息:"+string); socket.close(); } }
客户端:
package DUPDemo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class khd { public static void main(String[] args) throws IOException { byte[] buf="用户名:admin,密码:123".getBytes(); InetAddress address=InetAddress.getByName("localhost"); int port=8800; DatagramPacket packet=new DatagramPacket(buf, buf.length ,address, port); DatagramSocket socket=new DatagramSocket(); socket.send(packet); socket.close(); } }
在实际应用中,一般传输内容为对象,将用户名和密码封装在User类中传输。