JAVA基础--TCP编程

来源:互联网 发布:阿里云 虚拟主机 6元 编辑:程序博客网 时间:2024/06/05 11:50

我之前也讨论过了关于UDP编程的问题,貌似说UDP速度这么快,还好像很完美,那为什么要出现TCP呢?所谓存在即合理,其实这句话反而想对UDP说,在我看到的其实我感觉TCP的应用貌似广泛一点.暂且不说这些,那么我们的UDP有什么不好的地方呢,所谓一个弱点就是命门所在.UDP的弱点在于不可靠,又有人说不可靠是什么?我就形象地说一下,就比如说我们经常会下片,然后到了99%就不动,出现了数据丢失,要重新下载..尴尬不?当然这种情况的问题更多是由于以下几个原因:
1. 带宽不足
2. CPU处理不足,当然电脑有好坏,但是说大量的数据处理就会发生问题.当然UDP自己是有一个寄存器机制,但是只有1kb..貌似只能对某些字符串做手脚,所以还是存在着很多不良的后果

那么聊了这么多,TCP到底是什么?
TCP协议提供面向连接的服务,通过它建立的是可靠地连接,在java中Tcp的socket可以称为是流套接字.主要有Socket还有ServerSocket来完成.

Tco协议特点:
1. tcp是基于IO流进行数据 的传输 的,面向连接。
2. tcp进行数据传输的时候是没有大小限制的。
3. tcp是面向连接,通过三次握手的机制保证数据的完整性。 可靠协议。
4. tcp是面向连接的,所以速度慢。
5. tcp是分为客户端与服务端 的。

看到这里,其实我们只要这么区分也就可以了.TCP就等于两个人,各自站在一边,要相互触碰才能出现爱的火花.UDP就是我们参加了一个相亲网站,我们等着别人来通知我们.

TCP类(Api):
Socket:代表了TCP连接的一个客户端,客户端TCP向服务器端TCP发送连接请求, tcp的客户端一旦启动马上要与服务端进行连接。.
ServerSocket:代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的ServerSocket实例则监听来自客户端的TCP连接请求,并为每个请求创建新的Socket实例,由于服务端在调用accept()等待客户端的连接请求时会阻塞,直到收到客户端发送的连接请求才会继续往下执行代码,因此要为每个Socket连接开启一个线程。

Tcp的客户端使用步骤:
1. 建立tcp的客户端服务。
2. 获取到对应的流对象。
3.写出或读取数据
4. 关闭资源。

       package tcp;    import java.io.BufferedReader;    import java.io.IOException;    import java.io.OutputStream;    import java.net.Socket;    import java.net.UnknownHostException;    public class TcpClinet {        /**         * @param args         * @throws IOException          * @throws UnknownHostException          */        public static void main(String[] args) throws UnknownHostException, IOException {            // TODO Auto-generated method stub           //建立服务            Socket socket = new Socket("10.12.70.150",8989);            OutputStream outputStream = socket.getOutputStream();            outputStream.write("小hua1".getBytes());            socket.close();        }    }

服务端:

ServerSocket的使用 步骤
1. 建立tcp服务端 的服务。
2. 接受客户端的连接产生一个Socket.
3. 获取对应的流对象读取或者写出数据。
4. 关闭资源。

    package tcp;    import java.io.IOException;    import java.io.InputStream;    import java.net.ServerSocket;    import java.net.Socket;    public class TcpServer {        /**         * @param args         * @throws IOException          */        public static void main(String[] args) throws IOException {            // TODO Auto-generated method stub           //准备服务,需要监听接口            ServerSocket serverSocket = new ServerSocket(8989);            //接受客户端连接            Socket socket = serverSocket.accept();            //获取输入流对象,            InputStream inputStream = socket.getInputStream();            byte[] buf=new  byte[1024];            int length=0;            length=inputStream.read(buf);            String str = new String(buf,0,length);            System.out.println(socket.getInetAddress().getHostAddress()+":"+str);            serverSocket.close();        }    }

知识点精选:
1. 注意,我们服务端的ServerSocket是没有对于流的操作的类似于getInputStream这类的,因为我们一个服务端可能要接受很多客户端的请求,所以有时候我们要知道使用ServerSocket,那么应该是对应哪个请求.而假如使用的是socket就简单点,会用accept(),生成一个Socket,其实我个人认为这个应该是一个代理类.
2. accpet是一个堵塞型方法,所以我们要注意.

0 0