IP地址和端口号的组合得到一个网络套接字。

 
通信的两端都要有Socket,是两台机器间通信的端点
网络通信就是Socket间的通信,Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
基于Socket的TCP编程:
Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:
 
 
Socket类的常用方法:
 
ServerSocket类的常用方法:
 
基于Socket的TCP编程:
客户端Socket的工作过程包含以下四个基本的步骤:
1. 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。 
2. 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
3. 按照一定的协议对 Socket  进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。 
4. 关闭 Socket:断开客户端到服务器的连接,释放线路  
 
服务器程序的工作过程包含以下四个基本的步骤:
1.  调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
2.  调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。 
3.  调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
4.  关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。 
 
ServerSocket 对象负责等待客户端请求建立套接字连接,所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象:
ServerSocket ss = new ServerSocket(9999); 
Socket s = ss.accept (); 
InputStream in = s.getInputStream(); 
byte[] buf = new byte[1024];
 int num = in.read(buf); 
String str = new String(buf,0,num); 
System.out.println(s.getInetAddress().toString()+”:”+str); 
s.close(); 
ss.close();

 

UDP网络通信:
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。
流  程: 
1. DatagramSocket与DatagramPacket
2.  建立发送端,接收端 
3.  建立数据包 
4.  调用Socket的发送、接收方法 
4.  关闭Socket 
发送端与接收端是两个独立的运行程序 
 发送端:
     DatagramSocket ds = new DatagramSocket(); 
     byte[] by = “hello,atguigu.com”.getBytes(); 
     DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000); 
     ds.send(dp); 
     ds.close();
 接收端 :在接收端,要指定监听的端口。
     DatagramSocket ds = new DatagramSocket(10000);
     byte[] by = new byte[1024]; 
     DatagramPacket dp = new DatagramPacket(by,by.length); 
     ds.receive(dp); 
     String str = new String(dp.getData(),0,dp.getLength()); 
     System.out.println(str+"--"+dp.getAddress()); 
     ds.close(); 
 
Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? 
Server端程序:
package test;
import java.net.*;
import java.io.*; 
public class Server
{
 private ServerSocket ss;
 private Socket socket;
 private BufferedReader in;
 private PrintWriter out;
 public Server()
 {
  try
  {
   ss=new ServerSocket(10000);
   while(true)
   {
    socket = ss.accept();
    String RemoteIP = socket.getInetAddress().getHostAddress();
    String RemotePort = ":"+socket.getLocalPort();
    System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
    in = new BufferedReader(new 
InputStreamReader(socket.getInputStream()));
    String line = in.readLine();
    System.out.println("Cleint send is :" + line);
    out = new PrintWriter(socket.getOutputStream(),true);
    out.println("Your Message Received!");
    out.close();
    in.close();
    socket.close();
   }
  }catch (IOException e)
  {
   out.println("wrong");
  }
 }
 public static void main(String[] args)
 {
  new Server();
 }
};
Client端程序:
package test;
import java.io.*;
import java.net.*; 
public class Client
{
 Socket socket;
 BufferedReader in;
 PrintWriter out;
 public Client()
 {
  try
  {
   System.out.println("Try to Connect to 127.0.0.1:10000");
   socket = new Socket("127.0.0.1",10000);
   System.out.println("The Server Connected!");
   System.out.println("Please enter some Character:");
   BufferedReader line = new BufferedReader(new 
InputStreamReader(System.in));
   out = new PrintWriter(socket.getOutputStream(),true);
   out.println(line.readLine());
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   System.out.println(in.readLine());
   out.close();
   in.close();
   socket.close();
  }catch(IOException e)
  {
   out.println("Wrong");
  }
 }
 public static void main(String[] args)
 {
  new Client();
 }
}; 
 
 
 posted on 2016-08-17 00:14  Marval  阅读(234)  评论(0编辑  收藏  举报