本篇是学习网络编程的笔记,介绍了网络的模型,网络通讯的要素,网络通信的传输协议。
下图介绍简要介绍了网络编程的轮廓
下图对介绍了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 411android培训java培训期待与您交流!!! 银行业 ... -
“黑马程序员” 交通灯管理系统
2013-06-05 10:14 437android培训java培训期待与您交流!!! 交 ... -
“黑马程序员” 集合框架
2013-06-03 16:58 744android培训java培训期待与您交流!!! ... -
“黑马程序员”我所了解的设计模式
2013-06-03 15:29 689android培训java培训期待与您交流!!! ... -
“黑马程序员” String,StringBuffer,StringBuilder
2013-06-03 14:10 1142android培训java培训期待 ... -
“黑马程序员”反射机制
2013-05-30 22:36 616android培训、java培训 ... -
“黑马程序员”多线程
2013-05-30 20:57 637android培训 java培训期待与您交流!! ... -
“黑马程序员”多线程
2013-05-30 16:06 0... -
“黑马程序员”IO流2_File对象+properties的应用以及功能流中的其他对象
2013-05-30 15:47 627android培训 java培训期待与您交流! ... -
“黑马程序员”io流_1操作数据中的四个明确
2013-05-25 14:38 780android培训 ...
相关推荐
网络编程(七层协议+tcp_udp+socket编程)_python udp
这是一款串口+UDP+TCP通信三合一调试工具,很不错的轻量级软件,推荐给大家
本文用项目的方式讲解TCP Socket网络编程,用C语言编写了一个在线系统,然后通过TCP Scoket 套接字使得客户端和服务器能够进行交互通信。读者可运行项目,以项目的形式来理解TCP 网络编程。
包含网络UDP,tcp/ip 以及串口通讯详细代码
java网络编程UDP和TCP.pdf
简单的聊天程序 网络编程 UDP TCP
一个原创多端IM通信层框架,轻量级、高度提炼,历经8年、久经考验。可能是市面上唯一同时支持UDP+TCP+WebSo
我叫张俭,我的QQ745249934 欢迎有兴趣的朋友与我联系共同探讨编程的知识更希望您能够伴我解决一些我不算太懂的问题。...这里面的网络编程知识不多只是几个实例,向这些内容我这里还有很多有需要的朋友和我联系
用Socket写的简单聊天室,tcp+udp协议都用上了。 还有文件传输
注意:有2个严重BUG, 1. 在TCP接收数据时总是新创建INPUTSTREAM,这个INPUTSTREAM应该做为成员变量创建一次 2. 文件传输时回应不接收哪些文件存在BUG 请下载最新的程序,修正...采用UDP即时消息通信,TCP文件传输.最快10M/S
MFC SOCKET 双向通信,包括基于 UDP 协议的客户端/服务器端,基于 TCP 协议的客户端/服务器端
学习socket编程做的一个端口扫描工具,发出来给大家看看,有什么好的意见告诉我,尽量完善。 开发工具:C#.NET 2005
我用java写的一个飞鸽传书的小软件。把工程上传进来了。有需要的朋友 直接导入工程就可以运行了。 但是一台机子上只能运行一个。
分别死UPD和tcp写的聊天程序 比较简洁 适合新手
C++TCP/UDP网络调试助手源码!!!!!!!!!!
简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。本例程是基于Nodejs平台的TCP/IP通讯和UDP通讯示例
STM32F107+LAN8720A使用STM32cubeMX配置网络连接+tcp主从机+UDP app 以及ST官方的TCP例程 本例程的底层是由CubeMX生成,后续添加一些TCP和UDP的app,以及前期联网的DHIP逻辑一信息
Linux网络编程示例程序,包含TCP、UDP的server和client
描述了网络编程之TCP UDP流程比较 适合初级接触者使用
UDP/TCP转发工具 网络转发调试工具 特别好用