黑马程序员-TCP网络程序

TCP网络程序的工作原理

1.服务器创建一个ServerSocket类,然后调用accept方法等待客户机连接

2,客户端创建一个Socket并请求与服务器连接

3,服务器接收连接,并创建一个新的Socket与客户专线连接

4两个Socket在一个单独的线程上对话

5服务器开始等待新的连接。

 

ServerSocket类

   java.net包中

构造函数

public ServerSocket()

public ServerSocket(int port)

port 指定端口号,为0则自动分配一个空闲端口。通常都是自行指定端口。

public ServerSocket(int port,int backlog)

backlog参数指定在服务器忙时,可以等待连接的数量。默认为50

public ServerSocket(int port,int backlog,InetAddress bindAddr)

bindAddr指定ServerSocket绑定的IP地址,用于服务器上多个IP时使用。

 

close方法

关闭ServerSocket对象,通知驱动释放资源。

accept 方法

等待客户端的连接请求。一旦接收到连接请求,会返回一个Socket对象。

 

Socket类

public Socket()

用于连接多个服务器,动态指定服务器地址。

public Socket(String host,int port)

host指定服务器地址及端口

public Socket(String host,int port,InetAddress localAddr,int localPort)

localAddr 主要用于多网卡及多IP时指定要使用的IP

public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)

 

getInputStream 和getOutputStream方法

 

Socket以网络字节流的方式进行数据交换。

 

 

 

简单的TCP服务器程序

import java.net.*;
import java.io.*;
public class TcpServer {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) {
  
  // TODO: 在这添加你的代码
  try{
  
  ServerSocket ss=new ServerSocket(8001);
  Socket s=ss.accept(); //无连接请求时,accept方法将阻塞。
  InputStream ips=s.getInputStream();
  OutputStream ops=s.getOutputStream();
  ops.write("welcome to www.it315.org".getBytes());
  
  BufferedReader br=new BufferedReader(new InputStreamReader(ips));
  System.out.println(br.readLine());
  
  /*
  byte[] buf=new byte[1024];
  int len=ips.read(buf);
  System.out.println(new String(buf,0,len));
  */
  //ips.close();
  br.close();
  ops.close();
  s.close();
  ss.close();
  }catch(Exception e) {
   e.printStackTrace();
  }
 } 
}

 

完善的TCP服务器程序模型

import java.net.*;
public class ReverseServer {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) {
  // TODO: 在这添加你的代码
  try{
  

  ServerSocket ss=new ServerSocket(8001);
  boolean bRunning=true;
  while(bRunning){
   
   Socket s=ss.accept();
   new Thread(new Servicer(s)).start();
  }
  ss.close();
  }catch(Exception e) {
   e.printStackTrace();
  }
 } 
}

-----------------------------

import java.net.*;
import java.io.*;
public class Servicer implements Runnable {
 /**
  * Method run
  *
  *
  */
 private Socket s=null;
 public Servicer(Socket s){
  this.s=s;
 }
 public void run(){
  try{
  
  InputStream ips=s.getInputStream();
  OutputStream ops=s.getOutputStream();
  BufferedReader br=new BufferedReader(
   new InputStreamReader(ips));
  PrintWriter pw=new PrintWriter(ops,true);
  
  while(true){
   String strLine=br.readLine();
   if(strLine.equalsIgnoreCase("quit"))
   {
    break;
   }
   System.out.println(strLine+":"+strLine.length());
   String strEcho=(new StringBuffer(strLine).reverse()).toString();
   pw.println(strLine+"-->"+strEcho);
   
   
  }
  br.close();
  pw.close();
  s.close();
  }catch(Exception e) {
   e.printStackTrace();
  }
 }
 
}

-----------------------

TCP服务器程序编写要点:

     TCP服务器程序要想能接收多个客户端连接,需要循环调用accept方法

     服务器程序与每个客户端连接的会话过程不能互相影响,需要在独立的线程中运行。

     一个线程服务对象与一个服务端Socket对象关联,共同完成与一个客户端的对话。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值