黑马程序员——TCP并发,浏览器客户端与Tomcat服务器

来源:互联网 发布:数据恢复 破解版 编辑:程序博客网 时间:2024/05/12 11:17

------- android培训java培训、期待与您交流! ----------

TCP——客户端并发上传图片

 

那么就需要服务端有多条通道,客户端才可实现并发上传,

就需要用到多线程,来一个客户端,就分到一个线程,

每个线程里面都是一样的代码

 

服务端:

这个服务端有个局限性,当A客户端连接上以后,被服务端获取到。服务端执行

具体流程,这时B客户端连接只有等待,因为服务端还没有处理完A客户端的请求,还没有循环回来执行下一次accept方法,所以暂时获取不到B客户端对象。

 

那么为了可以让多个客户端同时并发范文服务端

那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端的请求。

 

如何定义线程呢?

只要明确了每一个客户端要在服务端执行的代码即可,将该代码存入run方法中

 

 

import java.io.*;

import java.net.*;

class PicThread  implements Runnable

{

   private Socket s;

   public PicThread(Socket s)

                                  {

       this.s=s;

    }

   public void run()

                                  {

                                     int count=1;

                                     String ip=s.getInetAddress().getHostAddress();

                                     try

                                     {

                                  

 

                                   System.out.println(ip+"....connnected");

 

        File file=new File(ip+"("+count+")"+".jpg");

 

                                   while(file.exists())

                                      {

                                         file=new File(ip+"("+(count++)+")"+".jpg");

                                      }

                                      

                                   FileOutputStream fos=new  FileOutputStream(file);

 

                                   InputStream in=s.getInputStream();

 

                                   byte[] buf=new byte[1024];

 

        int len=0;

 

                                   while((len=in.read(buf))!=-1)

                                   {

                                       fos.write(buf,0,len);

                                   }

 

                                   OutputStream out=s.getOutputStream();

 

                                   out.write("上传成功".getBytes());

 

        fos.close();

 

                                   s.close();

 

                                   //ss.close();

                                     }

                                     catch (Exception e)

                                     {

                                      throw new RuntimeException(ip+"上传失败");

                                     }

 

      

 

                                  

    }

}

 

class PicClient

{

                                  public static void main(String[] args) throws Exception

                                  {

        Socket s=new Socket("192.168.1.106",10003);

 

                                   FileInputStream fis=new FileInputStream("psb.jpg");

 

                                   OutputStream out=s.getOutputStream();

 

                                   byte[] buf=new byte[1024];

 

                                   int len=0;

 

                                   while((len=fis.read(buf))!=-1)

                                   {

                                       out.write(buf,0,len);

                                   }

       

                                   s.shutdownOutput();

 

                                   InputStream in=s.getInputStream();

 

                                   byte[] bufIn=new byte[1024];

 

                                   int num=in.read(bufIn);

 

                                   System.out.println(new String(bufIn,0,num));

 

                                   fis.close();

 

                                   s.close();

                                  }

}

 

 

class PicServer

{

                                  public static void main(String[] args) throws Exception

                                  {

                                   ServerSocket ss=new ServerSocket(10003);

 

                                  

 

                                   while(true)

                                   {

                                          Socket s=ss.accept();

                                      new Thread(new PicThread(s)).start();

                                   }

 

                                  

 

                                   //new Thread().start()

                                  }

}

 

 

 

TCP——客户端并发登录

客户端通过键盘录入用户名

服务端对这个用户名进行校验

 

如果该用户存在,在服务端显示xxx已登录

并在客户端显示xxx,欢迎光临

 

如果该用户存在,在服务端显示xxx,尝试登录

并在客户端显示xxx  该用户不存在

 

最多就登录三次

 

 

import java.io.*;

import java.net.*;

 

class loginClient

{

                                  public static void main(String[] args) throws Exception

                                  {

        Socket s=new Socket("192.168.1.106",10004);

 

                                   BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

 

                                   PrintWriter out=new PrintWriter(s.getOutputStream(),true);

 

                                   BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

 

                                   for(int x=0;x<3;x++)

                                   {

                                     String line=null;

 

                                     line=bufr.readLine();

 

                                     if(line==null)

                                            break;

 

                                     out.println(line);

 

                                     String info=bufIn.readLine();

 

                                     System.out.println(info);

 

                                     if(info.contains("欢迎"))

                                            break;

                                   }

                                  

                                   s.close();

                                  }

}

 

class loginThread implements Runnable

{

                                  private Socket s;

                                  loginThread(Socket s)

                                  {

                                     this.s=s;

                                  }

                                  public void run()

                                  {

 

                                   String ip=s.getInetAddress().getHostAddress();

 

                                      System.out.println(ip+".....connnected");

                                     try

                                   {

 

                                      for(int x=0;x<3;x++)

                                      {

                                             BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

                                             

                                             String name=bufIn.readLine();

 

                                             if(name==null)

                                                    break;

 

                                          BufferedReader bufr=new BufferedReader(new FileReader("user.txt"));

 

                                             PrintWriter out=new PrintWriter(s.getOutputStream(),true);

 

                                             String line=null;

 

                                             boolean flag=false;

 

               while((line=bufr.readLine())!=null)

                                            

                                             {

                                                 if(line.equals(name))

                                                    {

                                                       flag=true;

                                                          break;

                                                    }

                                                

                                             }

 

                                             if(flag)

                                             {

                                                     

                                                    System.out.println(name+"已登录");

                                                    out.println(name+"欢迎光临");

                                                    break;

                                             }

                                             else

                                             {

                                                 System.out.println(name+"尝试登录");

                                                    out.println(name+"该用户不存在");

                                                   

                                             }

                                            

                                      }

 

                                     }

                                     catch (Exception e)

                                     {

                                      throw new RuntimeException("登录失败");

                                     }

                                  }

}

 

 

class loginServer

{

                                  public static void main(String[] args) throws Exception

                                  {

                                   ServerSocket ss=new ServerSocket(10004);

 

                                   while(true)

                                   {

                                      Socket s=ss.accept();

 

                                      new Thread(new loginThread(s)).start();

                                   }

 

                                  }

}

 

对该例子的总结:

总结:描述TCP—客户端并发登录的程序,但是最多只能登录三次

 

客户端:

建立socket服务,并指定IP地址和端口号

建立缓冲区,从键盘的输入要登录的账号

建立socket输出流,用于向服务端发送键盘录入的账号

建立socket读取流,用于读取服务端发来的反馈信息

因为最多只能登录三次,所以使用for循环,循环3

定义String类型的line用于存储从键盘录入读取的信息

然后使用输出流将读到的值发送到服务端

再使用读取流,用来读取服务端发来的反馈信息,并打印在控制台山g

关闭客户端

 

服务端:

建立ServerSocket服务,并监听一个端口

使用while(true)循环

在里面获取连接过来的客户端对象  使用accept方法

因为要并发登录,所以必须使用多线程技术

new Thread建立线程,并开始执行

在线程中传入建立好的线程向里面传入获取的客户端对象

new Thread(new loginThread(s)).start();

 

建立的类并实现Runnable接口:

定义一个私有的Socket对象,并创建构造函数,在一初始化的

时候就将Socket对象传入

run()方法中

先获取本机的IP地址,并输入,证明已连接

因为最多能登录三次,所以循环三次

建立一个Socket读取流,用于读取从客户端发来的信息

String name=bufIn.readLine();读取客户端发来的账号

并存入一个变量中,用于后来的验证登录是否成功

如果name==null的时候,就停止,这是为了防止输入ctrl+c等的

字样的时候,客户端显示的空,但是在服务端仍然输出null已登录等

建立读取文本数据的字符流,因为应该有一个存储已存储的账号的数据

用与验证登录的信息,是否正确

建立socket输出流,用于将服务端的反馈信息写入到客户端中

因为要验证客户端发来的账户与已有的文本数据中的记录哪一个是

正确的,所以要定义一个变量flag用于记录

while循环读取文本数据中的账号,如果读到的数据与从客户端

获取的数据相同,则flag记录为true,因为已经找到,就是登录成功

所以就可以结束循环了

之后在判断flag,如果为真,则输出xxx已登录   xxx欢迎光临等

如果为假,则输出xxx尝试登录    xxx该用户不存在

 

 

 

telnetwindows中给我们提供的远程登录的工具,它

可以去连接网络中的任意一条主机,在dos命令下连接

在连接之后可以对这台主机进行命令下的配置

 

简单的来说telnet就是一个客户端的软件

 

 

浏览器客户端自定义服务器端:

1,客户端:浏览器

2,服务端:自定义

 

在浏览器中使用本机的IP地址和在服务端已经指定的要监听的端口,访问服务端即可

 

客户端:就是浏览器  http://192.168.1.108:11000/ 即可访问服务端

服务端:

import java.io.*;

import java.net.*;

class  ServerDemo

{

                                  public static void main(String[] args) throws Exception

                                  {

                                   ServerSocket ss=new ServerSocket(11000);

 

                                   Socket s=ss.accept();

 

                                   String ip=s.getInetAddress().getHostAddress();

 

                                   System.out.println(ip+".....connnected");

 

                                   PrintWriter out=new PrintWriter(s.getOutputStream(),true);

 

                                   out.println("客户端你好");

 

                                   s.close();

 

                                   ss.close();

                                  }

}

 

 

URL---URLConnnection对象

URL对象:

String getFile():获取此URL的文件名

String getHost():获取此URL的主机名(如果适用)

String getPath():获取此URL的路径部分

String getPort():获取此URL的端口号

String getProtocol():获取此URL的协议名称   

String getQuery():获取此URL的查询部       获取的是参数

 

URLConnetction

import java.net.*;

class  URLConnectionDemo

{

                                  public static void main(String[] args)

                                  {

                                   URL url=new URL("http://192.168.1.108:8080/myweb/demo.html");

       

//这使用了http协议进行了解析,解析完成之后,在运行时就没有请求头信息

        URLConnection conn=url.openConnnection();

 

                                   System.out.println(conn);

 

                                   InputStream in=conn.getInputStream();

 

                                   byte[] buf=new byte[1024];

 

                                   int len=in.read(buf);

 

                                   System.out.println(new String(buf,0,len));

                                  }

 

网络编程的小知识点:

 

ServerSocket(int port,int backlog):

Backlog:表示队列的最大长度,也就是连接数

 

 

------- android培训java培训、期待与您交流! ----------

0 0
原创粉丝点击