首页 > 代码库 > 黑马程序员——Java基础——网络编程02
黑马程序员——Java基础——网络编程02
第一讲 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 // 获得IP59 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=http://www.mamicode.com/null;74 boolean flag=false;75 while((data=http://www.mamicode.com/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的对象url70 URL url=new URL(path);71 // URL的对象通过openConnection连接网页并返回URLConnection的对象有点象Socket72 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,就不会讲请求发送出去了
黑马程序员——Java基础——网络编程02
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。