网络模型分为OSI参考模型和TCP/IP参考模型
两台主机之间传输联系
TCP和UDP就是传输层的东西。叫做传输控制协议和用户数据报协议两者的区别是
网络通信底层通过Socket实现。
UDP:Socket对象用DatagramSocket封装,构造方法如下
数据报对象用DatagramPacket封装
TCP 客户端 用 Sokect类进行封装。
服务器端用 SeverSokect类进行封装。
而网络互联需要Ip地址,ip地址在java里面用InetAddress类进行封装。
UDP
UDP我们平常用的QQ就是这样,他不需要知道你在不在线,只要把东西发给你就好。基于UDP做一个小的聊天室,代码贴在下面
UDP的数据源和目的都封装在数据报中,只需要发送和接收数据报就可以
//发送方 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { this.ds = ds; } public void run() { try { BufferedReader bf = new BufferedReader(new InputStreamReader( System.in)); String line = null; while ((line = bf.readLine()) != null) { byte[] buf=line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 12002); ds.send(dp); if("再见".equals(line)) break; } ds.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
//接收方 import java.net.DatagramPacket; import java.net.DatagramSocket; public class Recive implements Runnable { private DatagramSocket ds; public Recive(DatagramSocket ds) { this.ds = ds; } public void run() { try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); String text=new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + ":" + text); if (text.equals("再见")) { System.out.println(ip + "退出聊天室"); } } } catch (Exception e) { e.printStackTrace(); } } }
import java.net.DatagramSocket; import java.net.SocketException; public class Run { public static void main(String[] args) throws SocketException { DatagramSocket send=new DatagramSocket(); DatagramSocket recive=new DatagramSocket(12002); new Thread(new Send(send)).start(); new Thread(new Recive(recive)).start(); } }
基于多线程的实现,在一个窗口内既可以接收也可以发送。
TCP
TCP协议呢需要建立连接,建立连接以后才能通信,那怎么通信呢?必然是通过流。
建立一个基于TCP协议来实现的小聊天室。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Client{ public static void main(String[] args) throws UnknownHostException, IOException{ Socket s=new Socket(InetAddress.getByName("localHost"), 10002); PrintWriter p=new PrintWriter(s.getOutputStream(),true); BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=bf.readLine())!=null){ p.println(line); if("再见".equals(line)) break; } s.close(); bf.close(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class Server{ public static void main(String[] args) throws UnknownHostException, IOException{ Socket s=new Socket(InetAddress.getByName("localHost"), 10002); PrintWriter p=new PrintWriter(s.getOutputStream(),true); BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=bf.readLine())!=null){ p.println(line); if("再见".equals(line)) break; } s.close(); bf.close(); } }