Java中的TCP编程

Java中的TCP编程

TCP/IP通信协议是一种可靠的网络协议,能够在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。

Socket

在客户端可以使用Socket的构造器来连接到指定服务器,在Socket中可以使用如下两个构造函数。

  • Socket( InetAddress/String remoteAddress, int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本地地址、本地端口,默认使用本地主机的默认IP地址,默认使用系统动态指定的IP地址
  • Socket( InetAddress/String remoteAddress, int port, InetAddress localAddr,int localPort):创建连接到指定远程主机、远程端口的Socket,并指定本地IP地址和本地端口号,适用于本地主机有多个IP地址的情形

ServerSocket

服务器通过ServerSocket来进行监听,提供了如下的构造函数来创建对象。

  • ServerSocket( int port ):用指定的端口port来创建一个ServerSocket
  • ServerSocket( int port, int backlog ):增加一个用来改变连接队列长度的参数backlog
  • ServerSocket( int port, int backlog, InetAddress localAddr ) 当存在多个IP地址的情况下,允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址

当连接到指定服务器,让服务器端的ServerSocket的accept()方法执行,于是服务器端和客户端就产生一对互相连接的Socket。

客户端实例
Client.java

import java.net.*;
import java.io.*;
public class Client {

       
    public static void main(String[] args){

        String severName="localhost";
        int port =30000;
    	try{
            //客户端请求连接severName主机port端口建立TCP连接
    		System.out.println("连接到主机"+severName+" 端口号:"+port);
            Socket client=new Socket(severName,port);

            //获取输出流,用来发送数据给服务器
            System.out.println("远程主机地址:"+client.getRemoteSocketAddress());
            OutputStream outToSever=client.getOutputStream();
            DataOutputStream out=new DataOutputStream(outToSever);
            out.writeUTF("hello,。。。。。");

            //获取输入流,用来接收服务器的数据
            InputStream inFromSever=client.getInputStream();
            DataInputStream in=new DataInputStream(inFromSever);
            System.out.println("服务器响应:"+in.readUTF());
            client.close();
  		}catch(Exception e){
    		e.printStackTrace();
    	}   
    }     
}

服务器端实例
Server.java

import java.net.*;
import java.io.*;
public class Server extends Thread {

    private ServerSocket serverSocket;

    public Server(int port) throws IOException{
        serverSocket=new ServerSocket(port);
        serverSocket.setSoTimeout(10000);

    }
    public void run(){
        while(true){
            try{
                //通过相应的连接端口,等待连接
                System.out.println("等待远程连接,端口号为:"+serverSocket.getLocalPort());
                Socket server=serverSocket.accept();
                System.out.println("远程主机地址:" + server.getRemoteSocketAddress());

                //获取输入流,用来接收客户端的数据
                DataInputStream in = new DataInputStream(server.getInputStream());
                System.out.println("客服端响应:"+in.readUTF());

                //获取输出流,用来发送数据给客服端
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
                server.close();

            }catch(SocketTimeoutException s){
                System.out.println("Socket timed out!");
                break;

            }catch(IOException e){
                e.printStackTrace();
                break;

            }

        }

    }
     
    public static void main(String[] args){
        int port=30000;
        try{
            Thread t=new Server(port);
            t.run();
        }catch(IOException e){
            e.printStackTrace();
        }       
    }     
}

先运行Server.java,然后运行Client.java

服务器端的运行结果

等待远程连接,端口号为:30000
远程主机地址:/127.0.0.1:60776
客服端响应:hello,。。。。。
等待远程连接,端口号为:30000
Socket timed out!

客户端的运行结果

连接到主机localhost 端口号:30000
远程主机地址:localhost/127.0.0.1:30000
服务器响应:谢谢连接我:/127.0.0.1:30000
Goodbye!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值