Socket之UDP和TCP
文章目录
Socket协议编程实践【分布式计算】前言一、什么是Socket二、为什么要使用Socket三、套接字四、实验目标:给定包含学号和成绩的服务器文件,分别基于UDP和TCP,编写程序,实现客户端通过学号获取对应成绩。
1.基于UDP实现2.基于TCP实现 总结
前言
一、什么是Socket
独立于具体协议的网络编程接口
在ISO模型中,主要位于会话层和传输层之间
BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其他程序通讯的一个办法,目前已经被广泛移植到各个平台。
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。



