套接字 socket入门级知识

套接字 socket

几个重要概念:

网络通信协议概念:计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

网络通信接口:为了使两个结点之间能够进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:

硬件装置:实现结点之间的信息传送。

软件装置:规定双方进行通信的约定协议。

IP(InternetProtocol)协议:是网际层(OSI参考模型)的主要协议,支持网间互联的数据报通信。

TCP(Transmission control protocol)协议:是专门设计用于在不可靠得的因特网上提供可靠、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。

Socket

1.两个JAVA应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。

2.Socket通常用来实现client-server连接。

3.Java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client端和server端。

4.建立连接时所需的寻址信息为远程计算机的IP地址和端口号(port number)

Java流式输出/输出原理:在Java程序中,对于数据的输入(input)/输出(output)操作以“流”(stream)方式进行,java.io包中定义了各样的“流”类,用以获取不同种类的数据。

TCP/IP Socket通信:

Client

Socket(host,port#)

(Attempt to connect)

 

OutputStream

 

InputStream

 

Socket.close()

 

Server

ServerSocket s(port #)

s.accept() /等待连接

socket对象

 

 

 OutputStream

 

InputStream

 

 

 

Socket.close()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Server端:

首先导入所需要的包

 

l  首先导入所需要的包

import java.io.*;

import java.net.*;

 

l  定义server端的socket

ServerSocket server = null;

l  Server端开启socket通信的连接端口

server = new ServerSocket(4700);

l  定义接收client端连接的socket

Socket socket = null;

l  Server端监听并接受到套接字的连接。

socket = server.accept();

l  启用java输出输出流实现对数据流进行接收和发送

BufferedReader is = new BufferedReader(new InputStreamReader(

              socket.getInputStream()));//将server端输入通道包上缓冲流指向client端

           PrintWriter os = new PrintWriter(socket.getOutputStream());//将server端的输出通道包上打印流指向client端

           BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));//将server端输入通道指向标准键盘输入

 

l  调用流的readLine()方法从client端读一行,如果client没有内容,则处于阻塞状态,直到client端向server端发送了数据

System.out.println("Client:" + is.readLine());

l  从键盘读入数据,此方法也为阻塞式

String line = sin.readLine();

l  输出从键盘读入的数据到client端

os.println(line);       

l  启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。

socket.setSoTimeout(timeout);

l  捕捉异常,输出提示语句并且执行退出

catch(SocketTimeoutException e){

              System.out.println("等待传输数据超时..");

              System.exit(0);

           }

 

 

 

Client端:

l  Client端建立到server端的tcp socket连接,4700端口为server端侦听的端口

Socket socket = new Socket("127.0.0.1",4700);

l  初始化输出/输出

BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));//将client输入端指向标准键盘

            PrintWriter os = new PrintWriter(socket.getOutputStream());//将client输出端指向server端

            BufferedReader is = new BufferedReader(new InputStreamReader(

              socket.getInputStream()));//将client输入端指向server端

l  客户端从键盘读取数据

readline = sin.readLine();

l  Client端等待从server端输入的数据,此方法为阻塞方法

System.out.println("Server:" + is.readLine());

l  Client端输出数据到server端

os.println(readline);

l  Client端同样设置了超时退出

socket.setSoTimeout(timeout);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值