java 中的 socket 编程详细介绍

栏目: Java · 发布时间: 6年前

内容简介:java 中的 socket 编程详细介绍

一,网络编程中两个主要的问题

一个是怎样准确的定位网络上一台或多台主机,还有一个就是找到主机后怎样可靠高效的进行传输数据。

在TCP/IP协议中IP层主要负责网络主机的定位,传输数据的路由,由IP地址能够唯一地确定Internet上的一台主机。

而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的传输数据机制,这是网络编程的主要对象,一般不须要关心IP层是怎样处理数据的。

眼下较为流行的网络编程模型是客户机/server(C/S)结构。即通信两方一方作为server等待客户提出请求并予以响应。客户则在须要服务时向server提 出申请。server一般作为守护进程始终运行,监听网络port,一旦有客户请求,就会启动一个服务进程来响应该客户,同一时候自己继续监听服务port,使后来的客户也 能及时得到服务。

二,两类传输协议:TCP;UDP

TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,还有一个socket能够要求进行连接,一旦这两个socket连接起来,它们就能够进行双向传输数据,两方都能够进行发送 或接收操作。

UDP是User Datagram Protocol的简称,是一种无连接的协议,每一个数据报都是一个独立的信息,包含完整的源地址或目的地址,它在网络上以不论什么可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

比较:

UDP:1,每一个数据报中都给出了完整的地址信息,因此无须要建立发送方和接收方的连接。

2,UDP传输数据时是有限制大小的,每一个被传输的数据报必须限定在64KB之内。

       3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP:1,面向连接的协议,在socket之间进行传输数据之前必定要建立连接,所以在TCP中须要连接

时间。

        2,TCP传输数据限制大小,一旦连接建立起来,两方的socket就能够按统一的格式传输大的  

                数据。

         3,TCP是一个可靠的协议,它确保接收方全然正确地获取发送方所发送的所有数据。

应用:

1,TCP在网络通信上有极强的生命力,比如远程连接(Telnet)和文件传输(FTP)都须要不定长度的数据被可靠地传输。可是可靠的传输是要付出代价的,对数据内容正确性的检验必定占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。

2,UDP操作简单,而且仅须要较少的监护,因此通常常使用于局域网高可靠性的分散系统中client/server应用程序。比如视频会议系统,并不要求音频视频数据绝对的正确,仅仅要保证连贯性就能够了,这样的情况下显然使用UDP会更合理一些。

三,基于Socket的 java 网络编程

1,什么是Socket

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常常使用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个port号唯一确定。

可是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必定联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

2,Socket通讯的过程

Server端Listen(监听)某个port是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都能够通过Send,Write等解决方案与对方通信。

对于一个功能齐全的Socket,都要包含下面基本结构,其工作过程包含下面四个主要的步骤:

(1) 创建Socket;

(2) 打开连接到Socket的输入/出流;

(3) 依照一定的协议对Socket进行读/写操作;

(4) 关闭Socket.(在实际应用中,并未使用到显示的close,尽管许多文章都推荐如此,只是在我的程序中,可能由于程序本身比较简单,要求不高,所以并未造成什么影响。)

3,创建Socket

创建Socket

java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的client和服务端。这是两个封装得很好的类,使用很方便。其构造解决方案例如以下:

Socket(InetAddress address, int port);

Socket(InetAddress address, int port, boolean stream);

Socket(String host, int prot);

Socket(String host, int prot, boolean stream);

Socket(SocketImpl impl)

Socket(String host, int port, InetAddress localAddr, int localPort)

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

ServerSocket(int port);

ServerSocket(int port, int backlog);

ServerSocket(int port, int backlog, InetAddress bindAddr)

当中address、host和port分别是双向连接中还有一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的port号,localAddr和 bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既能够用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。比如:学习视频网 http://www.xxspw.com

Socket client = new Socket("127.0.01.", 80);

ServerSocket server = new ServerSocket(80);

注意,在选择port时,必须小心。每一个port提供一种特定的服务,唯独给出正确的port,才 能获得对应的服务。0~1023的port号为系统所保留,比如http服务的port号为80,telnet服务的port号为21,ftp服务的port号为23, 所以我们在选择port号时,最好选择一个大于1023的数以防止发生冲突。

在创建socket时假设错误发生,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。

4,简单的Client/Server程序

  1. client程序

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);

//向本机的4700port发出客户请求

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); //出错,则打印出错信息

}

}

}

2. server端程序

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在port4700监听客户请求

}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());

//在标准输出上打印从client读入的字符串

line=sin.readLine();

//从标准输入读入一字符串

while(!line.equals("bye")){

//假设该字符串为 "bye",则停止循环

os.println(line);

//向client输出该字符串

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);

//出错,打印出错信息

}

}

}

5,支持多客户的client/server程序

前面的Client/Server程序仅仅能实现Server和一个客户的对话。在实际应用 中,往往是在server上运行一个永久的程序,它能够接收来自其他多个client的请求,提供对应的服务。为了实如今server方给多个客户提供服务的功能,须要对上 面的程序进行改造,利用多线程实现多客户机制。server总是在指定的port上监听是否有客户请求,一旦监听到客户请求,server就会启动一个专门的服务线程来响 应该客户的请求,而server本身在启动完线程之后立即又进入监听状态,等待下一个客户的到来。

本文转自博客园知识天地的博客,原文链接: java 中的 socket 编程详细介绍 需转载请自行联系原博主。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python the Hard Way

Learn Python the Hard Way

Zed Shaw / Example Product Manufacturer / 2011

This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试