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);//端口号为:8080byte[] 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 hostnameDatagramSocket 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 serverBufferedReader 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){/*close failed*/}}}
}

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 destinationSocket 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.3String 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。

Socket协议编程实践相关推荐

  1. Socket 网络编程实践经验

    目录 文章目录 目录 Socket 与 HTTP 的区别 生产实践考虑 网络断开重连问题 Heartbeat 心跳机制 使用非阻塞模式下的 select 函数进行 Socket 连接检查 会话过期问题 ...

  2. UPnP协议编程实践

    本专题主要是介绍UPnP的工作原理和基本概念,包括SSDP.GENA和FXPP等基本协议,以及在Linux下如何使用Intel提供的UPnP开发包实现UPnP控制点和设备.本文是这个专题的第一篇,主要 ...

  3. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

  4. Socket编程实践(10) --select的限制与poll的使用

    select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或 ...

  5. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

  6. 树莓派Pico W无线开发板MQTT协议通信MicroPython编程实践

    本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板.电脑或An ...

  7. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...

  8. TinyDDS编程实践

    背景 传统计算机网络的运行依赖于集中式运营商及服务提供商(Server),它在拓扑结构上的典型特点就是存在一个或数个"中心节点".整个网络的数据传输和处理都集中在少数节点上.&qu ...

  9. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++

    C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...

最新文章

  1. 适合初学者学java技术的书籍推荐!
  2. 分享|如何制作高质量的图文摘要(Graphical Abstract)
  3. opencv 学习笔记9:图像缩放与图像翻转
  4. 基于mysql的主从复制之Mycat简单配置和高可用
  5. 网络游戏server编程,第一章笔记
  6. python 示例_Python使用示例设置add()方法
  7. 顺丰不行了吗?对快递行业的深度理解
  8. python中列表的查_每日一记----python中的列表【查询和插入】
  9. 自动化运维 Shell
  10. 网络通信基础(入门知识总结)
  11. 非参数统计——第二章 单样本问题
  12. 骨科手术ICD编码主要缺陷与原因分析
  13. Ubuntu 配置磁盘挂载到指定目录
  14. html 打开资源管理器,资源管理器怎么打开 教你如何快速打开资源管理器
  15. 叮咚叮咚,京东叮咚音箱Skill开发之路
  16. macOS安装MySQL,使用Navicat连接MySQL数据库/2022
  17. 台式计算机如何升级,老电脑如何升级 老电脑升级方法【详细介绍】
  18. html 获取声音频谱,[前端]利用WebAudioAPI获取音频频谱(html5音频可视化)
  19. 电脑安装android4.0虚拟机,尝鲜Android 4.0 PC端虚拟机安装指南
  20. HDU--2602--Bone Collector 【01背包】

热门文章

  1. 2020年10月30日提高组 B 超级蚯蚓
  2. 完成图书管理系统类图的绘制_自助图书馆应用
  3. LangSrcCurise ubuntu18.04部署指北
  4. 牛逼,Python3竟然内置找茬神器!一起来找茬吧
  5. 玩转Ubuntu操作系统(一)Ubuntu的安装
  6. 驼峰,下划线(蛇形)和帕斯卡型一些转换
  7. 用Unity实现景深效果
  8. 【报告分享】服装零售行业洞察报告-有赞伯俊(附下载)
  9. CentOS7 安装Tomcat
  10. STM32H7 CANFD