JAVA基础--TCP编程

我之前也讨论过了关于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值