第一讲 TCP的应用
使用TCP客户端上传图片:
1 /*使用TCP客户端上传图片 2 * 注:单线程的服务端有个举行性:当A客户客户端连接上一行,被服务端获取,B客户必须等待 3 * 那么为了可以让多个客户端同时并发访问服务器,最后服务短短将每个客户端封装一个单独的线程中 4 * 5 * 定义线程的方法 6 * 只有明确了每一个客户端要在服务端执行的代表。就将该代码存入run()方法中 7 */ 8 import java.io.*; 9 import java.net.*; 10 //客户端 11 class TCp { 12 public static void main(String[] args)throws Exception{ 13 // 一下是判断文件用的,其实应该写在服务端比较好 14 // 对传入的值进行判断 15 if(args.length!=1){ 16 System.out.println("请指定一个图片"); 17 return; 18 } 19 20 File file=new File(args[0]); 21 // 对文件路径进行判断 22 if(!(file.exists()&&file.isFile())){ 23 System.out.println("你上传的文件有问题,或不存在"); 24 return; 25 } 26 // 判断文件大小 27 if(file.length()>1024*1024){ 28 System.out.println("文件太大"); 29 return; 30 } 31 // 判断后缀 32 if(!file.getName().endsWith(".jpg")){ 33 System.out.println("图片格式错误"); 34 return; 35 } 36 // 创建服务 37 Socket s=new Socket("localhost",8888); 38 FileInputStream fis=new FileInputStream(file); 39 40 OutputStream out=s.getOutputStream(); 41 42 BufferedReader in = 43 new BufferedReader(new InputStreamReader(s.getInputStream())); 44 byte[] buf=new byte[1024]; 45 46 int len=0; 47 while((len=fis.read(buf))!=-1){ 48 49 out.write(buf,0,len); 50 } 51 // 结束标记 52 s.shutdownInput(); 53 // 反馈信息 54 String info = in.readLine(); 55 System.out.println(info); 56 fis.close(); 57 s.close(); 58 } 59 } 60 //服务端 61 class Server{ 62 public static void main(String[] args)throws Exception{ 63 64 ServerSocket ss=new ServerSocket(8888); 65 while(true){ 66 Socket s=ss.accept(); 67 // 每进入一个客户就执行的线程 68 new Thread(new PisThread(s)).start(); 69 } 70 } 71 } 72 //利用对现场实现并上传 73 74 class PisThread implements Runnable{ 75 private Socket s ; 76 PisThread(Socket s){ 77 this.s=s; 78 } 79 //复写run 80 public void run() { 81 int count=1;//计数器 82 String IP=s.getInetAddress().getHostAddress(); 83 84 try { 85 System.out.println(IP+"~~`connected"); 86 // 文件保存路径 87 File dir=new File("D:\\ttt\\"); 88 89 File file=new File(dir,IP+"tt.txt"); 90 // 判断文件是否存在 91 while(file.exists()){ 92 file=new File(dir,IP+"("+(count++)+").jpg"); 93 } 94 // 数据写入 95 FileOutputStream fos=new FileOutputStream(file); 96 byte[] buf=new byte[1024]; 97 int len=0; 98 while((len=in.read(buf))!=-1){ 99 100 fos.write(buf,0,len); 101 } 102 // 反馈信息 103 OutputStream out =s.getOutputStream(); 104 out.write("上传成功".getBytes()); 105 106 fos.close(); 107 s.close(); 108 } catch (Exception e) { 109 throw new RuntimeException("上传失败"); 110 } 111 112 } 113 114 }
二、客户端并发登陆
客户端键盘录入用户名,服务端对这个用户名进行校验。
如果该用户名存在,服务端现象XX,已登录;并在客户端显示,xx欢迎光临
如果用户不存在,在服务端显示xxx,尝试登陆,并在客户端显示xxx,该用户名不存在
1 //练习:用户登录 2 import java.io.*; 3 import java.net.*; 4 //客户端 5 class LoginCilent { 6 public static void main(String[] args)throws Exception{ 7 Socket s=new Socket("localhost",8888); 8 BufferedReader bufr= 9 new BufferedReader(new InputStreamReader(System.in)); 10 // 输出数据 11 PrintWriter pout=new PrintWriter(s.getOutputStream(),true); 12 13 BufferedReader bufin= 14 new BufferedReader(new InputStreamReader(s.getInputStream())); 15 String line=null; 16 // 三次登录 17 for(int x=0;x<3;x++){ 18 line=bufr.readLine(); 19 if(line==null){ 20 break; 21 } 22 // 搞出去 23 pout.println(line); 24 String info=bufin.readLine();//读取信息 25 System.out.println(info); 26 if(info.contains("欢迎")){ 27 break; 28 } 29 } 30 bufr.close(); 31 s.close(); 32 } 33 } 34 //服务端 35 36 class LoginServer{ 37 38 public static void main(String[] args)throws Exception{ 39 ServerSocket ss=new ServerSocket(8888); 40 41 while(true){ 42 43 Socket s=ss.accept(); 44 45 new Thread(new LoginThread(s)).start(); 46 } 47 48 } 49 } 50 51 //线程端 52 class LoginThread implements Runnable{ 53 private Socket s; 54 LoginThread(Socket s){ 55 this.s=s; 56 } 57 public void run(){ 58 // 获得IP 59 String IP=s.getInetAddress().getHostAddress(); 60 System.out.println(IP+"~`connected"); 61 try { 62 for(int i=0;i<3;i++){ 63 BufferedReader in=//读取获得的信息 64 new BufferedReader(new InputStreamReader(s.getInputStream())); 65 // 读取自己数据库的信息 66 BufferedReader brin= 67 new BufferedReader(new FileReader("ttt.txt")); 68 // 读取获得的数据和数据库对比 69 String line=in.readLine(); 70 if(line==null){//客户端没有发生数据,跳出循环 71 break; 72 } 73 String data=null; 74 boolean flag=false; 75 while((data=in.readLine())!=null){ 76 if(data.equals(line)){ 77 flag=true; 78 break; 79 } 80 81 } 82 // 将数据输出 83 PrintWriter out=new PrintWriter(s.getOutputStream(),true); 84 if(flag){ 85 System.out.println(line+",已登录"); 86 out.print(line+"欢迎光临"); 87 }else{ 88 System.out.println(line+",尝试登录失败"); 89 out.print(line+",用户名不存在"); 90 } 91 } 92 s.close(); 93 } catch (Exception e) { 94 throw new RuntimeException("用户名登录失败"); 95 } 96 97 } 98 99 }
URL和URLConnection
1、URL:
URI:范围更大,条形码也包含于此范围
URL:范围下,即域名
方法:
1)构造函数:URL(protocal,host,port,file)
2)String getProtocol():获取协议名称
3)Stirng getHost();获取主机名
4)int getPort():获取端口
5)String getFile():获取URL文件名
6)Stirng getPath():获取URL的路径部分
7) Stirng getQuety():获取URL的查询部
2、URLConnection使用步骤
1)URL Connection openConnection():用URL调用此方法,返回URLconnection对象
2)INputStream getInputStream():获取输入流
3)OutputStream getOutputStream():获取输出流
1 import java.io.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 import java.net.*; 5 6 class myIEGUiDemo { 7 // 各组件 8 private Frame f; 9 private Button but,bok; 10 private TextField tf; 11 private TextArea ta; 12 // 构造函数 13 myIEGUiDemo(){ 14 init(); 15 } 16 // 实现组件功能 17 private void init() { 18 f=new Frame("我的IE"); 19 but=new Button("跳转"); 20 tf=new TextField(50); 21 ta=new TextArea(20,60); 22 23 // 基本设置 24 f.setBounds(300,10,500,500); 25 f.setLayout(new FlowLayout()); 26 // 添加组件 27 f.add(tf); 28 f.add(but); 29 f.add(ta); 30 // 窗体事件 31 myEvent(); 32 33 f.setVisible(true); 34 } 35 // 注册事件 36 private void myEvent() { 37 // 窗体关闭 38 f.addWindowListener(new WindowAdapter(){ 39 public void windowClosing(WindowEvent e){ 40 System.exit(0); 41 } 42 }); 43 // 跳转事件 44 but.addActionListener(new ActionListener() { 45 46 public void actionPerformed(ActionEvent e0) { 47 // 在文本域中显示内容 48 showFile(); 49 50 } 51 }); 52 53 // 文本框事件 54 tf.addKeyListener(new KeyAdapter(){ 55 public void keyPressed(KeyEvent ex){ 56 // 键盘按下回车 57 if(ex.getKeyCode()==KeyEvent.VK_ENTER){ 58 showFile(); 59 } 60 } 61 }); 62 } 63 // 网页显示 64 private void showFile(){ 65 // 刷空 66 ta.setText(""); 67 String path=tf.getText();//获得输入路径 68 try { 69 // 路径封装为地址对象URL的对象url 70 URL url=new URL(path); 71 // URL的对象通过openConnection连接网页并返回URLConnection的对象有点象Socket 72 URLConnection conn=url.openConnection(); 73 74 // 读取流,用于读取服务器返回数据 75 InputStream in=conn.getInputStream(); 76 77 byte[] buf=new byte[1024*1024]; 78 79 int len=in.read(buf); 80 // 显示在文本域 81 ta.append(new String(buf,0,len)); 82 83 } catch (Exception e) { 84 throw new RuntimeException("连接失败"); 85 } 86 } 87 88 public static void main(String[] args){ 89 new myIEGUiDemo(); 90 } 91 }
域名解析:
host应用:可屏蔽一些恶意网站,即将对应的映射关系写在hosts中,将IP地址改为本机的回环地址,那么会直接找到hosts,就不会讲请求发送出去了
时间: 2024-10-05 00:58:35