关于socket与serversocket中的输入输出流

1,客户端的socket连接到服务器的套接字

    socket mysocket=new socket("127.0.0.1",30000);用端口号30000连接到本机,当然这里可能发生io异常,注意抛异常

当套接字mysocket建立后,类似一条通信线路已经建立。

    mysocket可以使用getInputStream()方法获得一个输入流,用此输入流来读服务器放入“线路”中的信息(但是不能读自己放入"线路"的信息,就像打电话的听筒)。当然与此对应的mysocket还可以用getOutputStream()方法来获得一个输出流,即拿到了自己的话筒,将自己的要输出的信息放入“线路”

    实际中可能会把mysocket使用getInputStream()获得的输入流的信息放到另一个数据流(如DataInputStream)上,同样把DataOutputStream()流代替getOutputStream()方法

2,ServerSocket类

》客户端建立的socket连接只是负责呼叫服务器,那么服务器也要建立一个等待接受客户的套接字serversocket对象

 ServerSocket server_socket=new ServerSocket(30000);与上面的端口号一致


服务器的ServerSocket对象server_socket建立以后,可以使用accept()方法接收客户的套接字呼应

》Socket sc=server_socket.accept();

所谓"接收"客户的套接字连接就是accept()方法会返回一个和客户端Socket对象相连接的Socket对象,服务器端的Socket对象sc使用getoutputstream()方法获得的输出流将指向客户端Socket对象mysocket使用getinoutstream()获得的那个输入流;

同样sc使用getinoutstream获得的输入流将指向mysocket使用getoutputstream获得的输出流



上图只是指示出一般的数据流向,实际中的mysocket求情连接和server_socket等待连接,其连接过程是一直相互的


>>使用套接字连接时,可能在一断没发出数据之前,另一端就开始尝试读取,这样就会堵塞本线程,直到读到信息为止

同样,accept()方法也会堵塞线程

用完连接后注意close()方法关闭socket


4,将套接字放到线程中

因为线程容易堵塞,所以应该为每个套接字连接建立一个线程

例如:客户端使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象要调用

public void connect(SocketAddress xxx) throws IOException

请求和参数SocketAddress 指定地址的套接字建立连接。

为使用该connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,InetSocketAddress的构造方法如下:

public InetSocketAddress(InetSocketAddress add,int port),

下面是简单的实例(不完整):

Socket socket=new Socket();
.
.
.
InetAddress addre=InetAddress.getByName("127.0.0.1");
InetSocketAddress socketAddress=new InetSocketAddress(addre,4331);
socket.connect(socketAddress);
...
...
..

当然实际中是自己写一些connect连接方法,可以嵌入自己的需要的一些功能(如添加对话框,登录框、进行验证等)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值