------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络协议
TCP协议和UDP协议是比较常用的网络协议,两者同为网络协议,是一种数据交换的规则和标准
TCP协议:TCP是一种面向连接(连接导向)的、可靠的、基于字节流的基于传输层的通信协议,是一个较安全的通信协议。在建立通信时,需要在客户端和服务端建立安全套接字(socket),建立连接后双方可以双向数据传输,双方都可作为发送发和接收方。
UDP协议:UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址和目的地址。能在网上以任何的路径发往目的地,所以能否发送至目的地,以及内容的正确性都是不能保证的。
URL(统一资源定位器):它表示在internet上某一资源的地址,通过URL我们可以访问该网络资源。URL的组成是有格式的:protocol://resourceName。例如:http://www.baidu.com
socket 通信
使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket
创建socket
其中address 和 port 分别是创建套接字的ip地址以及端口号
下面我们来看看一个简单的socket程序
客户端程序:
- import java.io.*;
- import java.net.*;
- public class TalkClient {
- public static void main(String args[]) {
- try{
- Socket socket=new Socket("127.0.0.1",4700);
- //向本机的4700端口发出客户请求
- BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
- //由系统标准输入设备构造BufferedReader对象
- PrintWriter os=new PrintWriter(socket.getOutputStream());
- //由Socket对象得到输出流,并构造PrintWriter对象
- BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- //由Socket对象得到输入流,并构造相应的BufferedReader对象
- String readline;
- readline=sin.readLine(); //从系统标准输入读入一字符串
- while(!readline.equals("bye")){
- //若从标准输入读入的字符串为 "bye"则停止循环
- os.println(readline);
- //将从系统标准输入读入的字符串输出到Server
- os.flush();
- //刷新输出流,使Server马上收到该字符串
- System.out.println("Client:"+readline);
- //在系统标准输出上打印读入的字符串
- System.out.println("Server:"+is.readLine());
- //从Server读入一字符串,并打印到标准输出上
- readline=sin.readLine(); //从系统标准输入读入一字符串
- } //继续循环
- os.close(); //关闭Socket输出流
- is.close(); //关闭Socket输入流
- socket.close(); //关闭Socket
- }catch(Exception e) {
- System.out.println("Error"+e); //出错,则打印出错信息
- }
- }
- }
服务端程序:
- import java.io.*;
- import java.net.*;
- import java.applet.Applet;
- public class TalkServer{
- public static void main(String args[]) {
- try{
- ServerSocket server=null;
- try{
- server=new ServerSocket(4700);
- //创建一个ServerSocket在端口4700监听客户请求
- }catch(Exception e) {
- System.out.println("can not listen to:"+e);
- //出错,打印出错信息
- }
- Socket socket=null;
- try{
- socket=server.accept();
- //使用accept()阻塞等待客户请求,有客户
- //请求到来则产生一个Socket对象,并继续执行
- }catch(Exception e) {
- System.out.println("Error."+e);
- //出错,打印出错信息
- }
- String line;
- BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- //由Socket对象得到输入流,并构造相应的BufferedReader对象
- PrintWriter os=newPrintWriter(socket.getOutputStream());
- //由Socket对象得到输出流,并构造PrintWriter对象
- BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
- //由系统标准输入设备构造BufferedReader对象
- System.out.println("Client:"+is.readLine());
- //在标准输出上打印从客户端读入的字符串
- line=sin.readLine();
- //从标准输入读入一字符串
- while(!line.equals("bye")){
- //如果该字符串为 "bye",则停止循环
- os.println(line);
- //向客户端输出该字符串
- os.flush();
- //刷新输出流,使Client马上收到该字符串
- System.out.println("Server:"+line);
- //在系统标准输出上打印读入的字符串
- System.out.println("Client:"+is.readLine());
- //从Client读入一字符串,并打印到标准输出上
- line=sin.readLine();
- //从系统标准输入读入一字符串
- } //继续循环
- os.close(); //关闭Socket输出流
- is.close(); //关闭Socket输入流
- socket.close(); //关闭Socket
- server.close(); //关闭ServerSocket
- }catch(Exception e){
- System.out.println("Error:"+e);
- //出错,打印出错信息
- }
- }
- }