1.

 

 2.TCP是面向连接的数据传输机制,有三次握手;而UPD协议是无连接协议,不能保证传输的可靠性。

3.在Java语言中,网络编程是从协议的传输层开始的,程序设计时,在基于应用层时选择Java高层次网络编程,基于传输层时选择低层次网络编程。

4.Socket编程时,目的地址和端口号需要在创建对象时指出,使用数据报时,需要在构造Datagram时指出。

5.利用URLConnection对象编写程序返回某网站的首页,并将首页内容存放到文件当中

 

import java.io.*;
import java.net.*;

public class URLC {
    public static void main(String[] args) throws IOException {
        URL cya = new URL("https://www.cnblogs.com/cyades/");
        URLConnection con = cya.openConnection();
        BufferedReader is=  new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
        FileOutputStream fos = new FileOutputStream("d:\\test.txt");
        String line;
        while((line = is.readLine()) != null ) {
            line = line + "\n";
            fos.write(line.getBytes("UTF-8"));
            fos.flush();
        }
        is.close();
        fos.close();
    }
    private URLConnection openConnection() {
        return null;
    }
}

 

参考资料:https://blog.csdn.net/weixin_44798518/article/details/103110835

 

 


 

 可相应多个客户端的服务器端程序,客户端程序不变,服务器端程序为MultiTalkServer和ServerThread

import java.io.*;
import java.net.*;
import ServerThread;
public class MultiTalkServer{
    static int clientnum=0; //静态成员变量,记录当前客户的个数
    public static void main(String args[]) throws IOException {
        ServerSocket serverSocket=null;
        boolean listening=true;
        try{
            //创建一个ServerSocket在端口监听客户的请求
            serverSocket=new ServerSocket(4700);             
        }catch(IOException e) {
            System.out.println("Could not listen on port:4700.");
            System.exit(-1); //退出
        }
        while(listening){ //循环监听
          //监听到客户请求,根据得到的Socket对象和客户计数创建并启动服务线程
          new ServerThread(serverSocket.accept(),clientnum).start();
          clientnum++; //增加客户技术
        }
        serverSocket.close(); //关闭ServerSocket
    }
}
import java.io.*;
import java.net.*;
public class ServerThread extends Thread{
    Socket socket=null; //保存与本线程相关的Socket对象
    int clientnum; //保存本线程的客户计数
    public ServerThread(Socket socket,int num) { //构造方法
         this.socket=socket; //初始化socket变量
         clientnum=num+1; //初始化clientnum变量
    }
    public void run() { //线程主题
        try{
            String line;
            //由Socket对象得到输入流,并构造相应的BufferedReader对象
            BufferedReader is=new BufferedReader(new 
            InputStreamReader(socket.getInputStream()));
            //由Socket对象得到输出流,并构造PrintWrite对象
            PrintWriter os=new PrintWriter(socket.getOutputStream());
            //由系统标准输入设备构造BufferedReader对象
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
            //在显示屏上输出从客户端读入的字符串
            System.out.println("Client:"+ clientnum +is.readLine());
            //从标准输入读入一字符串
            line=sin.readLine();
            while(!line.equals("bye")){//如果该字符串为bye,则停止循环
               os.println(line);//向客户端输出该字符串
               os.flush();//刷新输出流,使Client马上收到该字符串
               //在显示屏上输出该字符串
               System.out.println("Server:"+line);
               //从Client读入一字符串,并输出到显示屏上
               System.out.println("Client:"+ clientnum +is.readLine());
               line=sin.readLine();//从系统标准输入读入一字符串
            }//继续循环
            os.close(); //关闭Socket输出流
            is.close(); //关闭Socket输入流
            socket.close(); //关闭Socket
        }catch(Exception e){
            System.out.println("Error:"+e);//在显示屏上输出错误信息
        }
    }
}

基于UDP的C/S网络传输程序

 

import java.io.*;
import java.net.*;
import java.util.*;
public class QuoteClient {
    public static void main(String[] args) throws IOException
        {
         if(args.length!=1){
           //如果启动的时候没有给出Server的名字,那么打印出错信息并退出
           System.out.println("Usage:java QuoteClient <hostname>");
           return;
         }
         DatagramSocket socket=new DatagramSocket();//创建数据报套接字
         byte[] buf=new byte[256]; //创建缓冲区
         //由命令行给出的第一个参数默认为Server的名字,通过它得到Server的IP信息
         InetAddress address=InetAddress.getByName(args[0]);
         //创建DatagramPacket对象
         DatagramPacket packet=new DatagramPacket(buf, buf.length, address, 4445);
         socket.send(packet); //发送
         //创建新的DatagramPacket对象,用来接收数据报
         packet=new DatagramPacket(buf,buf.length);
         socket.receive(packet); //接收
         //根据接收到的字节数组生成相应的字符串
         String received=new String(packet.getData());
         //打印生成的字符串
         System.out.println("Quote of the Moment:"+received );         
         socket.close(); //关闭套接口
        }
}

 

public class QuoteServer{
    public static void main(String args[]) throws java.io.IOException
    {
        new QuoteServerThread().start();//启动一个QuoteServerThread线程
    }
}
import java.io.*;
import java.net.*;
import java.util.*;
public class QuoteServerThread extends Thread//服务器线程
{  protected DatagramSocket socket=null;//记录和本对象相关联的DatagramSocket对象
   protected BufferedReader in=null;//用来读文件的一个Reader
   protected boolean moreQuotes=true;//标志变量,是否继续操作
      public QuoteServerThread() throws IOException {//无参数的构造函数
        this("QuoteServerThread");//以QuoteServerThread为默认值调用带参数的构造函数
      }
      public QuoteServerThread(String name) throws IOException {
        super(name); //调用父类的构造函数
        socket=new DatagramSocket(4445);//在端口4445创建数据报套接字        
        in= new BufferedReader(new InputStreamReader(System.in));
}    
     public void run() //线程主体
     {
        while(moreQuotes) {
            try{
                byte[] buf=new byte[256]; //创建缓冲区
                DatagramPacket packet=new DatagramPacket(buf,buf.length);
                //由缓冲区构造DatagramPacket对象
                socket.receive(packet); //接收数据报                
                //打印出客户端发送的内容
                System.out.println(new String(packet.getData())); 
                //从屏幕获取输入内容,作为发送给客户端的内容
                String dString= in.readLine();    
                //如果是bye,则向客户端发完消息后退出
                if(dString.equals("bye")){moreQuotes=false;}
                buf=dString.getBytes();//把String转换成字节数组,以便传送
                //从Client端传来的Packet中得到Client地址
                InetAddress address=packet.getAddress();
                int port=packet.getPort(); //端口号
                //根据客户端信息构建DatagramPacket
                packet=new DatagramPacket(buf,buf.length,address,port);
                socket.send(packet); //发送数据报
            }catch(IOException e) { //异常处理
                e.printStackTrace(); //打印错误栈
                moreQuotes=false; //标志变量置false,以结束循环
            }
         }
         socket.close(); //关闭数据报套接字
       }    
}

 

posted on 2020-11-09 20:12  studycya  阅读(73)  评论(0)    收藏  举报