黑马程序员——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该用户不存在
telnet是windows中给我们提供的远程登录的工具,它
可以去连接网络中的任意一条主机,在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培训、期待与您交流! ----------
- 黑马程序员——TCP并发,浏览器客户端与Tomcat服务器
- 黑马程序员—TCP-客户端并发登录小例子
- 黑马程序员—TCP-客户端并发上传图片小例子
- 黑马程序员-TCP上传图片-多线程并发上传图片-客户端并发登陆-自定义服务器
- 黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器
- 黑马程序员-TCP协议服务端ServerScoket接收客户端并发请求。
- 黑马程序员 Java练习-模拟TCP客户端并发上传图片
- 黑马程序员-----网络编程中Tcp客户端并发上传图片
- 黑马程序员-----简单理解 浏览器与服务器
- 黑马程序员——TCP客户端,服务端介绍
- 黑马程序员——TCP客户端,服务端互相发送信息
- 黑马程序员——使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。 服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
- 黑马程序员————java中基于tcp模拟多客户端上次图片到服务器
- Linux select TCP并发服务器与客户端编程
- Linux select TCP并发服务器与客户端编程
- 黑马程序员——>第二十四天<网络编程(TCP-Tomcat)>
- 黑马程序员 --------tcp的客户端与服务端的数据传输
- TCP 服务器与客户端
- 机器学习问题方法总结
- 图的拓扑排序
- web前端优化
- [BZOJ3991]SDOI2015寻宝游戏|set|虚树
- UISegmentedControl的详细使用
- 黑马程序员——TCP并发,浏览器客户端与Tomcat服务器
- HDU 5273 Dylans loves sequence(区间DP)
- 深度学习笔记1(卷积神经网络)
- jquery.banner.js图片更换
- HDU 5272 Dylans loves numbers
- hdu 5273 Dylans loves sequence
- Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue
- -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a
- 列表切片list slicing