网络编程

来源:互联网 发布:自动卡密发卡平台源码 编辑:程序博客网 时间:2024/06/06 01:04

C/S和B/S

         CS(Client Server 客户端服务端编程) :该架构一般我们需要安装一个客户端程序;服务器端代码更新,客户端也要跟着更新。不需要依赖浏览器进行编程。
       优点:是能够充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端相应速度快。
       缺点:1、只适用于局域网。而随着互联网的飞速发展,移动办公和分布式办公越来越普及。
          2、客户端需要安装专用的客户端软件。需要进行安装和维护,比较麻烦
BS(Browser Server 浏览器与服务器编程)架构,不需要安装客户端软件,只需要一个浏览器;服务器代码升级的话,不存在客户端升级的问题。

计算机与计算通讯的三要素

  1、ip地址

2、端口号
3、通讯协议(udp,tcp等)

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("-", "");}}



原创粉丝点击