网络编程
来源:互联网 发布:自动卡密发卡平台源码 编辑:程序博客网 时间:2024/06/06 01:04
C/S和B/S
计算机与计算通讯的三要素
1、ip地址
UDP协议
在java中不管是用哪种协议通讯,计算机与计算机之间的通讯我们都统称为Socket(插座)通讯. 通讯的两端计算机都必须要安装上Socket。在不同的协议下就应该有不同的插座
udp协议特点:
电脑cpu处理能力不足,带宽不足会出先丢包的情况。
1。 将数据极其源和目的封装为数据包,不需要建立连接
2.每个数据包大小限制在64K内
3.因为无连接,所以不可靠(会出出现数据丢失)
4.因为不需要建立连接,所以速度快
5.udp协议是不分客户端与服务端的,只分发送端与接收端。
UDP通讯:
DatagramSocket(udp协议的服务类)
DatagramPacket(数据包类)
*.DatagramPacket(byte[]buf, int length, InetAddress address, int port)
buf:当前数据的字节数组表示形式。
length: 字节数组的长度。
address: 发送的IP地址。
port:端口号。
package udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;/** * 1。 将数据极其源和目的封装为数据包,不需要建立连接2. 每个数据包大小限制在64K内3. 因为无连接,所以不可靠(会出出现数据丢失)4. 因为不需要建立连接,所以速度快5. udp协议是不分客户端与服务端的,只分发送端与接收端。端口号被占用java.net.BindException: Address already in use: Cannot bind * */public class Receive {public static void main(String[] args) throws IOException {//1.创建udp服务对象 监听9090端口号DatagramSocket s=new DatagramSocket(9090);//2.准备空的数据包byte[] buf=new byte[1024];DatagramPacket p=new DatagramPacket(buf, buf.length);//3.接收s.receive(p);//阻塞型方法System.out.println("接收到的数据是:"+new String(buf,0,p.getLength()));//4.关s.send(p);s.close();}}
package udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/** * 1。 将数据极其源和目的封装为数据包,不需要建立连接2. 每个数据包大小限制在64K内3. 因为无连接,所以不可靠(会出出现数据丢失)4. 因为不需要建立连接,所以速度快5. udp协议是不分客户端与服务端的,只分发送端与接收端。UDP服务对象:DatagramSocket数据包对象:DatagramPacket * */public class Send {public static void main(String[] args) throws IOException {//1.创建udp服务对象DatagramSocket s=new DatagramSocket();//2.准备数据和数据包String data="hello World";DatagramPacket p=new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getByName("127.0.0.1"), 9090);//3.发送数据s.send(p);byte[] buf=new byte[1024];DatagramPacket p1=new DatagramPacket(buf, buf.length);s.receive(p1);System.out.println(new String(buf,0,p1.getLength()));//4.释放资源s.close();}}
飞秋Demo
package udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/** * 1。 将数据极其源和目的封装为数据包,不需要建立连接2. 每个数据包大小限制在64K内3. 因为无连接,所以不可靠(会出出现数据丢失)4. 因为不需要建立连接,所以速度快5. udp协议是不分客户端与服务端的,只分发送端与接收端。UDP服务对象:DatagramSocket数据包对象:DatagramPacket * */public class Send {public static void main(String[] args) throws IOException {//1.创建udp服务对象DatagramSocket s=new DatagramSocket();//2.准备数据和数据包String data="hello World";DatagramPacket p=new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getByName("127.0.0.1"), 9090);//3.发送数据s.send(p);byte[] buf=new byte[1024];DatagramPacket p1=new DatagramPacket(buf, buf.length);s.receive(p1);System.out.println(new String(buf,0,p1.getLength()));//4.释放资源s.close();}}
TCP
三次握手:
tcp的特点:
1.tcp协议通讯是面向连接的,tcp的客户端一旦建立,马上要与服务端建立连接。
2.tcp协议在连接中传输大数据量,tcp是基于IO流进行数据传输。
3.通过三次握手机制连接,可靠协议(保证数据传输的完整性)
4.因为tcp是面向连接的,所以效率稍低.
5.tcp协议是分客户端与服务端。
比如:QQ文件传输、 飞Q文件传输
tcp协议下的Socket:
Socket(客户端类)
Demo
package tcp;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class TcpClient {public static void main(String[] args) throws UnknownHostException, IOException {//1.创建TCP客户端对象SocketSocket s=new Socket(InetAddress.getByName("127.0.0.1"), 9797);OutputStream os = s.getOutputStream();String data="hello 杰瑞!";os.write(data.getBytes());s.shutdownOutput();//把流关闭//接收服务端发送来的数据InputStream in = s.getInputStream();byte[] buf=new byte[1024];int length=0;while((length=in.read(buf))!=-1){System.out.println(new String(buf,0,length));}os.flush();os.close();s.close();}}
package tcp;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class TcpServer {public static void main(String[] args) throws IOException {//1.创建ServerSocket tcp服务端对象ServerSocket s=new ServerSocket(9797);//监听端口号while(true){//2.三次握手Socket socket = s.accept();//阻塞型方法InputStream in = socket.getInputStream(); /** * 3.读取 * 1.循环读 * 2.available */System.out.println("============"+in.available());byte[] buf=new byte[in.available()];//int read = in.read(buf);int length = in.read(buf);System.out.println(new String(buf,0,length));//服务端可以写到客户端OutputStream os = socket.getOutputStream(); os.write("哈哈哈嘿嘿嘿呵呵呵".getBytes());socket.shutdownOutput();//关闭输出流 写完了os.flush();os.close();in.close();socket.close();}}}
图片服务器
package imagethread;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * @author 谢英亮 * @date 2017年12月22日 下午2:35:01 * @Description: 图片服务器:客户端访问该服务端会得到一个图片 */public class ImageServer implements Runnable {Socket socket = null;public ImageServer(Socket socket){this.socket=socket;}@Overridepublic void run() {InputStream in = null;OutputStream os = null;try {in = new FileInputStream(new File("1.jpg"));// 从硬盘上把图片读取到程序/** * 1.循环读取:边读编写 2.available */System.out.println("============" + in.available());byte[] buf = new byte[in.available()];in.read(buf);// 写出os = socket.getOutputStream();os.write(buf);os.flush();// os.close();socket.shutdownOutput();// 关闭流System.out.println(socket.getInetAddress().getHostAddress()+"/"+socket.getInetAddress().getHostName()+"下载了一只图片");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {os.close();in.close();socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
package imagethread;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/** * @author 谢英亮 * @date 2017年12月22日 下午2:35:46 * @Description: 客户端 */public class GetImage {public static void main(String[] args) throws UnknownHostException, IOException {Socket s=new Socket(InetAddress.getByName("10.7.186.89"), 9898);InputStream in = s.getInputStream();FileOutputStream os=new FileOutputStream(new File(Util.getUUIDStr()+".jpg"));//System.out.println(in.available());byte[] buf=new byte[1024];int length=0;while((length=in.read(buf))!=-1){os.write(buf,0,length);}os.flush();os.close();in.close();System.out.println("获得一只MM~~~");}}
package imagethread;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;public class Demo {/** * 想统计一下有多少人下载图片 * * 一个ip无论下载多少次 只算一次: * Set * Map:key:ip value:下载的次数 * * @param args * @throws IOException */public static void main(String[] args) throws IOException {ServerSocket server=new ServerSocket(9898);Map<String,Integer> map=new HashMap<>();int i=0;while(true){Socket accept = server.accept();//下载的ipString ip = accept.getInetAddress().getHostAddress();if(map.containsKey(ip)){//下载过了 次数++//获得原来下载的次数int value = map.get(ip);map.put(ip, ++value);}else{map.put(ip, 1);}i++;new Thread(new ImageServer(accept)).start();System.out.println("下载次数"+i+"\t多少人下载:"+map.size());}}}
package imagethread;import java.util.UUID;/** * @author 谢英亮 * @date 2017年12月22日 下午2:37:03 * @Description: 产生一个32位的随机数 0-9 a-f组成 */public class Util {public static String getUUIDStr(){return UUID.randomUUID().toString().replace("-", "");}}
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- Rust golang之结构体
- ideallij之Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter
- 转载:Http协议详解
- markdown入门语法
- eclipse使用码云上传代码和下载代码
- 网络编程
- C# Queue的使用
- 第三课:把tensorflow,模型和测试数据导入Android工程
- Activity的四种启动模式
- jsTree
- LeetCode之1-bit and 2-bit Characters(Kotlin)
- Android代码连接Wifi时被系统切换到其他Wifi的问题
- 怎样提高数据恢复的成功率
- 结构+算法