
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(); //关闭数据报套接字 } }
浙公网安备 33010602011771号