【黑马程序员】TCP实例

来源:互联网 发布:上海数据交易中心 地址 编辑:程序博客网 时间:2024/05/22 04:47

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


TCP:端到端的字节流通信的协议

import java.net.*;

import java.io.*;

public class TCPServer {

   public static void main(Stringargs[]) throws IOException

   {

       ServerSocketss=new ServerSocket(6666);//通过某个端口来监听客户端的连接,阻塞式

       Sockets = ss.accept();

       System.out.println("a client connect!");//一旦连接成功则打印一句话

       //由于以上只能接收一个连接,故放在while循环中,每来一个连接就打印一句话

       while(true) {

           Sockets2 = ss.accept();//接受客服端的连接,并且服务器端再建立一个socket来和一个特定的客户端连接。这样的话就处理了多个申请连接的情况

           System.out.println("已建立连接");

           DataInputStreamdis = new DataInputStream(s2.getInputStream());//注意s.getInputStream()返回的是InputStream类型,即在InputStream类型上又包了一个DataInputStream类型的管道dis。

           System.out.println("客户端发送来的信息为"+dis.readUTF());//readUTF()是阻塞式的,所以此时若客户端不发东西,那么它就一直在这里阻塞,也就是说这个while循环就停在这里了即其他的客户无法再连接进来。

           dis.close();//关闭此数据输入流

           s.close();//关闭此套接字

 

           }

       

   }

}

注意:

(1)要先运行server再运行client。

(2)accept()和readUTF()都是阻塞式的

(3)交流的信息,相对于服务器端是输入,相对于客户端是输出

 

由于是阻塞式的,如果client端不发送任何信息,readUTF会一直等待,而另一个client将无法连接到server

当然Server也可以用相同的方法向客户端写数据

s.getInetAddress()  获取客户端的IP

s.getPort()   获取客户端的端口

 

套接字:多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。

为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序

与TCP/IP协议交互提供了称为套接字(Socket)的接口

 

Socket(InetAddressaddress, int port)

创建一个流套接字并将其连接到指定IP 地址的指定端口号。

 

Socket->accept()

侦听并接受到此套接字的连接。

 

Socket->InputStreamgetInputStream()

返回此套接字的输入流。

 

DataInputStream

数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本Java 数据类型。

应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

 

DataInputStreamreadUTF()

从流 in 中读取用UTF-8 修改版格式编码的 Unicode 字符格式的字符串;然后以 String 形式返回此字符串。

UTF-8修改版的表示形式的一些细节与 DataInput 的 readUTF 方法完全相同。

 

 

import java.net.*;

import java.io.*;

public class TCPClient {

    public static void main(String[] args) throwsException {

        Sockets = new Socket("127.0.0.1"6666);//本机IP,并指定要连接在哪个端口上,Client端的端口系统会自己找一个

        OutputStreamos = s.getOutputStream();//一旦互联后可通过管道()来说话

        DataOutputStreamdos = new DataOutputStream(os);//外包一层

        dos.writeUTF("hello server!");

        dos.flush();//清空此数据输出流

        dos.close();//关闭此数据输出流

        s.close();//关闭此套接字

    }

}

先运行TCPServer 后再运行TCPClient可看到如下输出结果

运行两次TCPClient可看到如下输出结果

 

 

Socket->OutputStreamgetOutputStream()

返回此套接字的输出流。

 

DataOutputStream(OutputStreamout)

数据输出流可以使一个应用程序以简洁的方式将Java 基本数据类型写入到一个输出流。

随后某个应用程序能使用一个数据输入流读回这些数据。

 

DataOutputStream->voidwriteUTF(String str)

以与机器无关方式使用UTF-8 修改版编码将一个字符串写入基础输出流。 

原创粉丝点击