栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Socket协议编程实践

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Socket协议编程实践

Socket协议编程实践【分布式计算】

Socket之UDP和TCP


文章目录

Socket协议编程实践【分布式计算】前言一、什么是Socket二、为什么要使用Socket三、套接字四、实验目标:给定包含学号和成绩的服务器文件,分别基于UDP和TCP,编写程序,实现客户端通过学号获取对应成绩。

1.基于UDP实现2.基于TCP实现 总结


前言
一、什么是Socket

独立于具体协议的网络编程接口
在ISO模型中,主要位于会话层和传输层之间
BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其他程序通讯的一个办法,目前已经被广泛移植到各个平台。

二、为什么要使用Socket

三、套接字

四、实验目标:给定包含学号和成绩的服务器文件,分别基于UDP和TCP,编写程序,实现客户端通过学号获取对应成绩。 1.基于UDP实现

UDPServer.java

import java.net.*;
import java.util.Arrays;
import java.io.*;
public class UDPServer{
	public static void main(String args[]){ 
	DatagramSocket aSocket = null;
	    try{
	    	aSocket = new DatagramSocket(8080);//端口号为:8080
	    	byte[] buffer = new byte[1000];
	    	byte[] id = new byte[1000];
	    	byte[] score = new byte[1000];
	    	DatagramPacket request = new DatagramPacket(buffer, buffer.length);
	    	aSocket.receive(request);
	    	BufferedReader i = new BufferedReader(new FileReader("C:\Users\Linyz\Desktop\data.txt"));
	    	String str;
	    	while ((str = i.readLine()) != null) {
	    		String[] tokens = str.split(",");
	    		id = tokens[0].getBytes();
	    		score = tokens[1].getBytes();
	    		int nLen = request.getLength();
	    		String r,I;
	    		r = new String(request.getData(),0,nLen);
	    		I = new String(id);
	    		if (r.equals(I)) {
	    			request.setData(score);
	    			DatagramPacket reply = new DatagramPacket(request.getData(), request.getLength(), request.getAddress(), request.getPort());
	    			aSocket.send(reply);
	    			break;
	    		}else {
	    			System.out.println("没有该学生!");
	    		}			
		}		
	    }catch (SocketException e){System.out.println("Socket: " + e.getMessage());
	   }catch (IOException e) {System.out.println("IO: " + e.getMessage());}
	finally {if(aSocket != null) aSocket.close();}
    }
}

UDPClient.java

import java.net.*;
import java.util.Scanner;


import java.io.*;

public class UDPClient{
    public static void main(String args[]){ 
	// args give message contents and server hostname
	DatagramSocket aSocket = null;
	  try {
		aSocket = new DatagramSocket();
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入学生学号:");
		String stuid  = sc.next();
		byte [] m = stuid.getBytes();
		InetAddress aHost = InetAddress.getByName(args[1]);
		int serverPort = 8080;		                                                 
		DatagramPacket request = new DatagramPacket(m,  m.length, aHost, serverPort);
		aSocket.send(request);			                        
		byte[] buffer = new byte[1000];
		DatagramPacket reply = new DatagramPacket(buffer, buffer.length);	
		aSocket.receive(reply);
		System.out.println("成绩是: " + new String(reply.getData()));	
	  }catch (SocketException e){System.out.println("Socket: " + e.getMessage());
	  }catch (IOException e){System.out.println("IO: " + e.getMessage());}
	finally {if(aSocket != null) aSocket.close();}
   } 
}
2.基于TCP实现

TCPServer.java

import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;

public class TCPServer {
    public static void main (String args[]) {
	try{
		int serverPort = 8080; 
		ServerSocket listenSocket = new ServerSocket(serverPort);
		while(true) {
			Socket clientSocket = listenSocket.accept();
			Connection c = new Connection(clientSocket);
		}
	} catch(IOException e) {System.out.println("Listen :"+e.getMessage());}
    }
}

class Connection extends Thread {
	DataInputStream in;
	DataOutputStream out;
	Socket clientSocket;
	public Connection (Socket aClientSocket) {
	    try {
		clientSocket = aClientSocket;
		in = new DataInputStream( clientSocket.getInputStream());
		out =new DataOutputStream( clientSocket.getOutputStream());
		this.start();
	     } catch(IOException e)  {System.out.println("Connection:"+e.getMessage());}
	}
	public void run(){
	    try {			                 // an echo server
	    	BufferedReader i = new BufferedReader(new FileReader("C:\Users\Linyz\Desktop\data.txt"));
			String str;
			List IDhList = new ArrayList();
			List ScoreList = new ArrayList();
	    	while ((str = i.readLine()) != null) {
				String[] tokens = str.split(",");
				IDhList.add(tokens[0]);
				ScoreList.add(tokens[1]);
			}
	    	
	    String data = in.readUTF();
	    if (IDhList.contains(data)) {
			int n =IDhList.indexOf(data);
	    	out.writeUTF((String)ScoreList.get(n));
		}
	    //String data = in.readUTF();	                 
		//out.writeUTF(data);
	    } catch(EOFException e) {System.out.println("EOF:"+e.getMessage());
	    } catch(IOException e) {System.out.println("IO:"+e.getMessage());}
	    finally{ try {clientSocket.close();}catch (IOException e){}}
	}
}

TCPClient.java

import java.net.*;
import java.util.Scanner;
import java.io.*;
public class TCPClient {
	public static void main (String args[]) {
	// arguments supply message and hostname of destination
	Socket s = null;
	    try{
	    	int serverPort = 8080;
	   	s = new Socket(args[1], serverPort);    
		DataInputStream in = new DataInputStream( s.getInputStream());
		DataOutputStream out =new DataOutputStream( s.getOutputStream());
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入学生学号:");
		String z = sc.next();
		out.writeUTF(z);        	// UTF is a string encoding see Sn 4.3
		String data = in.readUTF();	      
		System.out.println("成绩是: "+ data) ;      
       	    }catch (UnknownHostException e){
			System.out.println("Sock:"+e.getMessage()); 
	    }catch (EOFException e){System.out.println("EOF:"+e.getMessage());
    	    }catch (IOException e){System.out.println("IO:"+e.getMessage());}
	finally {if(s!=null) try {s.close();}catch (IOException e){System.out.println("close:"+e.getMessage());}}
  	}
}
总结

1.如果出现:Socket: Address already in use: Cannot bind 则是端口号被 占用需 要解决的办法是:在任务管理器中杀死相应的进程Javaw.exe。
2.对于arg[0]的解释:program argument。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768778.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号