本篇是学习网络编程的笔记,介绍了网络的模型,网络通讯的要素,网络通信的传输协议。
下图介绍简要介绍了网络编程的轮廓
下图对介绍了TCP,UDP,HTTP传输协议,以及如何使用这些协议进行简单的网络传输操作
以下是使用多线程+UDP实现一个简单的聊天程序的示例代码段1
发送消息端,将发送消息的任务封装到线程的run()
package com.Chat; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /* * 创建UDP传输的发送端。 * 思路: * 1,建立udp的socket服务。 * 2,将要发送的数据封装到数据包中。 * 3,通过udp的socket服务将数据包发送出去。 * 4,关闭socket服务。 */ public class Send implements Runnable{ //1,udpsocket服务。使用DatagramSocket对象。 private DatagramSocket ds; public Send(DatagramSocket ds){ this.ds=ds; } @Override public void run() { System.out.println("发送端启动!!"); while (true){ BufferedReader buf=new BufferedReader(new InputStreamReader(System.in)); String line=null; try { while((line=buf.readLine())!=null){ //2,将要发送的数据封装到数据包中。 byte [] bt=line.getBytes(); DatagramPacket dp=new DatagramPacket(bt, bt.length, InetAddress.getByName("192.168.1.104") ,8888); ds.send(dp); if(line.equals("over"))break; } } catch (Exception e) { e.printStackTrace(); } if(ds!=null)ds.close(); } } }
接收发送的消息。
package com.Chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 建立UDP接收端的思路。 * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。 * 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据. * 3,使用socket服务的receive方法将接收的数据存储到数据包中。 * 4,通过数据包的方法解析数据包中的数据。 * 5,关闭资源 */ public class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds){ this.ds=ds; } @Override public void run() { System.out.println("接收端启动"); while(true){ byte [] buf=new byte[1024]; //2.创建数据包 DatagramPacket dp=new DatagramPacket(buf, buf.length); try { // 3,使用接收方法将数据存储到数据包中 ds.receive(dp); // 4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。 String ip=dp.getAddress().getHostAddress(); int port =dp.getPort(); byte [] bt=dp.getData();//数据内容 String data=new String(bt,0,dp.getLength()); System.out.println(ip+"---"+port+":"+data); if(data.equals("over")){ System.out.println(ip+"退出了"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
启动程序,实现聊天
package com.Chat; import java.net.DatagramSocket; import java.net.SocketException; public class chatTest { public static void main(String[] args) { try { DatagramSocket send=new DatagramSocket(10000); DatagramSocket rece=new DatagramSocket(8888); Thread t1=new Thread(new Send(send)); Thread t2=new Thread(new Rece(rece)); t1.start(); t2.start(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
聊天程序到这里就完成了。
以下程序是使用多线程技术+TCP是先一个服务端同时处理多个客户端上传图片的请求。
下面是服务端的实现代码,运行时服务端应该先启动
package com.TcpTest; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class UploadPciServer { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { ServerSocket ss=new ServerSocket(); while(true){ Socket s=ss.accept(); new Thread(new uploadTasd(s)).start(); } } }
因为客户端执行多个上传任务是需要多线程来实现,所以将上传文件的操作封装成线程任务
package com.TcpTest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class uploadTasd implements Runnable { private Socket s; private static final int SIZE = 1024*1024*2; public uploadTasd(Socket s) { super(); this.s = s; } @Override public void run() { try { //获取Socket String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+"-----------connected"); int count=0; File dir=new File("c:/upload"); if(!dir.exists()){ System.out.println(dir.mkdirs()); } File file = new File(dir, ip + ".jpg"); //如果文件已经存在于服务端 ,避免文件的覆盖 while(file.exists()){ file = new File(dir,ip+"("+(++count)+").jpg"); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos=new BufferedOutputStream(fos); BufferedInputStream bis=new BufferedInputStream(s.getInputStream()); int len=0; while((len=bis.read())!=-1){ bos.write(len); if(file.length()>SIZE){ System.out.println(ip+"文件体积过大"); bos.close(); s.close(); System.out.println(ip+"...."+file.delete()); return ; } } OutputStream out=s.getOutputStream(); out.write("上传成功!".getBytes()); bos.close(); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
下面是客户端的实现代码
package com.TcpTest; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class UploadPicClient { /** * @throws Exception * @throws UnknownHostException * */ public static void main(String[] args) throws UnknownHostException, Exception { //创建Socket客户端对象 Socket s=new Socket("192.168.1.104",10000); FileInputStream fis=new FileInputStream(new File("c:/89.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();//告诉服务端说:这边的数据发送完毕。让服务端停止读取 //读取服务端发回的内容 byte [] btIn=new byte[1024]; InputStream is=s.getInputStream(); int lenIn= is.read(btIn); String answer=new String(btIn, 0,lenIn); System.out.println(answer); fis.close(); s.close(); } }
发表评论
-
“黑马程序员” 银行业务调度系统
2013-06-05 11:28 440android培训java培训期待与您交流!!! 银行业 ... -
“黑马程序员” 交通灯管理系统
2013-06-05 10:14 479android培训java培训期待与您交流!!! 交 ... -
“黑马程序员” 集合框架
2013-06-03 16:58 780android培训java培训期待与您交流!!! ... -
“黑马程序员”我所了解的设计模式
2013-06-03 15:29 731android培训java培训期待与您交流!!! ... -
“黑马程序员” String,StringBuffer,StringBuilder
2013-06-03 14:10 1191android培训java培训期待 ... -
“黑马程序员”反射机制
2013-05-30 22:36 657android培训、java培训 ... -
“黑马程序员”多线程
2013-05-30 20:57 672android培训 java培训期待与您交流!! ... -
“黑马程序员”多线程
2013-05-30 16:06 0... -
“黑马程序员”IO流2_File对象+properties的应用以及功能流中的其他对象
2013-05-30 15:47 659android培训 java培训期待与您交流! ... -
“黑马程序员”io流_1操作数据中的四个明确
2013-05-25 14:38 810android培训 ...
相关推荐
4、 什么情况下适合用UDP协议,什么情况下适合用TCP协议? 5、 throw和throws有什么区别? try、catch、finally分别在什么情况下使用? 6、 声明类Person,包含2个成员变量:name、age。定义函数sayHello(),调用...
Socket通信是网络编程中不可或缺的技术,Qt支持基于TCP/IP协议的客户端和服务器端编程,以及UDP通信和组播技术。 多线程是现代应用程序中用来提高性能的重要技术。Qt提供了多线程编程的支持,包括线程的基本概念...
- **传输协议**:如TCP/IP协议,用于规定数据如何在网络中传输。 - **端口号**:用于标识网络中不同服务或应用的端口,客户端通过端口号与服务器通信。 - **IP地址**:用于唯一标识网络中的设备。 #### 12. UDP和...
8. **网络编程**:Socket编程基础,TCP和UDP的区别,以及HTTP协议的理解。 9. **设计模式**:学习常见的设计模式,如单例模式、工厂模式、建造者模式、装饰器模式、观察者模式等,并能灵活运用到实际项目中。 10. ...
11. **网络编程**:介绍如何使用Python进行HTTP请求,或者实现简单的TCP/UDP通信。 12. **数据分析与可视化**:利用Pandas进行数据清洗和分析,用Matplotlib或Seaborn绘制图表。 13. **自动化脚本**:教授如何编写...
8. **网络编程**:包括TCP和UDP协议,Socket编程,以及服务器和客户端的交互。 9. **反射和注解**:讲解如何通过反射动态操作类、接口和对象,以及注解的使用和自定义注解的实现。 10. **垃圾回收机制**:理解Java...
10. **网络编程**:学习Socket编程,包括TCP和UDP通信,理解服务器端和客户端的实现。 11. **Java API**:熟悉Java提供的各种标准库,如Math类、Date类、Calendar类等,以及各种实用工具类。 12. **JDBC**:了解...
网络编程部分可能包括套接字编程,如Socket和ServerSocket的使用,以及TCP和UDP协议的实现。 最后,理解JVM(Java虚拟机)的工作原理对优化代码性能至关重要。笔记可能涉及类加载机制、内存模型、垃圾收集算法以及...
黑马程序员训练营基础测试题目 为什么需要配置path 什么时候需要classpath 什么情况下适合用UDP协议 什么情况下适合用TCP协议 编程计算3乘8等于几 什么方法效率更高 throw和throws有什么区别 try catch finally...
9. **网络编程**:基础的Socket编程,了解TCP和UDP协议,以及如何创建服务器和客户端程序。 10. **泛型**:理解泛型的作用,学会在类、接口、方法和集合中使用泛型。 11. **JavaFX或Swing**:对于图形用户界面...
Swoole提供异步非阻塞的TCP/UDP服务器,HTTP服务器,WebSocket服务器等,特别适合处理大量并发请求,对于在线教育平台中的实时互动场景,如视频直播、聊天室等,Swoole能显著提高性能,降低延迟。 【标签】:...
4. **TCP、UDP和套接字**:除了HTTP,Vert.x还允许直接操作TCP、UDP和套接字,为低级网络编程提供了可能,适合构建物联网(IoT)应用或者自定义通信协议。 5. **文件系统操作**:内置的文件系统操作API让你能够便捷地...
【描述】:“这份JAVA笔记详尽记录了黑马程序员线下课程的基础语言部分,涵盖了JAVA编程的核心概念和技术。” 【知识点详解】 1. **JAVA语言基础** - 变量与数据类型:JAVA支持基本数据类型(如int, double, char...
4. **网络编程与并发**:对Python的socket编程进行了讲解,包括TCP和UDP通信,以及线程和进程的使用,为处理并发问题提供了理论基础。 5. **数据库操作**:介绍了如何使用Python与常见的关系型数据库(如MySQL、...
Java编程语言作为软件开发领域的主流技术之一,深受程序员的喜爱,尤其对于初学者和求职者来说,掌握Java技能是进入IT行业的关键。传智播客是一家知名的教育机构,其推出的“java就业班”课程旨在帮助学员在短时间内...