TCP的数据传输

服务器端(非多线程)    
用指定的端口实例化一个SeverSocket对象。服务器就可以用这个端口监听从客户端发来的连接请求。
调用ServerSocket的accept()方法,以在等待连接期间造成阻塞,监听连接从端口上发来的连接请求。
利用accept方法返回的客户端的Socket对象,进行读写IO的操作
关闭打开的流和Socket对象

服务器端
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serversocket=new ServerSocket(10086);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket=serversocket.accept();
//3、获取输入流,并读取客户端信息
InputStream is=socket.getInputstream;
InputStreamReader isr =newInputStreamReader(is);
BufferedReader br =newBufferedReader(isr);
String s=null;
while((s=br.readline())!-null){
System.out.println("我是服务器,客户端说:"+s);
}

 

socket.shutdownInput();//关闭输入流

 

 

//4、获取输出流,响应客户端的请求
OutputStream os=socket.getOutputstream();
PrintWriter pw=new PrintWriter(os);
pw.write("你好,服务器");
pw.flush();
//5、关闭资源
is.close();
isr.close();
br.close();
os.close();
pr.close();
serversocket.close();
socket.close();


客户端
用服务器的IP地址和端口号实例化Socket对象。
调用connect方法,连接到服务器上。
获得Socket上的流,把流封装进BufferedReader/PrintWriter的实例,以进行读写

 

利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流

 

 

关闭打开的流和Socket。
//1、创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket(192.168.0.1,10086);
//2、获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputstream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:admin;密码:admin");
pw.flush();
//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() //后写入套接字输出流,则该流将抛出 IOException。
socket.shutdownOutput();
//3、获取输入流,并读取服务器端的响应信息
InputStream is=socket.getInputstream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String s=null;
while((s=br.readline)!=null){
System.out.println("Hello,我是客户端,服务器说:"+s);
}
//4、关闭资源
os.close();
pw.close();
is.close();
isr.close();
br.close();
socket.close();




服务器端 (多线程)
服务器端创建ServerSocket,循环调用accept()等待客户端连接
客户端创建一个socket并请求和服务器端连接
服务器端接受客户端请求,创建socket与该客户建立专线连接
建立连接的两个socket在一个单独的线程上对话
服务器端继续等待新的连接

//服务器线程处理 和本线程相关的socket
Socket socket=null;
public ServerThread(Socket socket){
this.socket=socket;
}
ServerSocket serversocket=new ServerSocket("10086");
Socket socket=null;
int count=0;//记录客户端的数量
while(true){
socket=ServerSocket.accept();
ServerThread serverthread=new ServerThread(socket);
serverthread.start();
count++;
System.out.println("客户端连接的数量:"+count);
}




host、InetAddress和InetSocketAddress的区别
1、host是计算机名称,如localhost,administrator。
2、InetAddress一般这样使用:其中不可以包含端口(我看文档了,这样理解是对的)。
  InetAddress remoteAddr=InetAddress.getByName(“192.168.0.2″);
3、InetSocketAddress可以实现地址+端口。在需要设置连接超时时间的场合,必须使用InetSocketAddress。
Socket socket=new Socket();
SocketAddress remoteAddr=new InetSocketAddress(“localhost”,8000);
socket.connect(remoteAddr,6000);//将等待时间设置为6秒



SocketAddress addr = new InetSocketAddress("172.20.33.70", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("baidu.com", 80);
try {
    socket.connect(dest);
} catch (IOException e) {
    e.printStackTrace();
}






SOCKET的方法
/**
 *  获得远程服务器的IP 地址.
 */
InetAddress inetAddress = socket.getInetAddress();


/**
 * 获得远程服务器的端口.
 */
int port = socket.getPort();


/**
 * 获得客户本地的IP 地址.
 */
InetAddress localAddress = socket.getLocalAddress();


/**
 * 获得客户本地的端口.
 */
int localPort = socket.getLocalPort();


/**
 * 获取本地的地址和端口号
 */
SocketAddress localSocketAddress = socket.getLocalSocketAddress();


/**
 * 获得远程的地址和端口号
 */
SocketAddress remoteSocketAddress = socket.getRemoteSocketAddress();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值