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);//端口号为: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协议编程实践相关推荐
- Socket 网络编程实践经验
目录 文章目录 目录 Socket 与 HTTP 的区别 生产实践考虑 网络断开重连问题 Heartbeat 心跳机制 使用非阻塞模式下的 select 函数进行 Socket 连接检查 会话过期问题 ...
- UPnP协议编程实践
本专题主要是介绍UPnP的工作原理和基本概念,包括SSDP.GENA和FXPP等基本协议,以及在Linux下如何使用Intel提供的UPnP开发包实现UPnP控制点和设备.本文是这个专题的第一篇,主要 ...
- Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...
- Socket编程实践(10) --select的限制与poll的使用
select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或 ...
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协 ...
- 树莓派Pico W无线开发板MQTT协议通信MicroPython编程实践
本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板.电脑或An ...
- 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...
- TinyDDS编程实践
背景 传统计算机网络的运行依赖于集中式运营商及服务提供商(Server),它在拓扑结构上的典型特点就是存在一个或数个"中心节点".整个网络的数据传输和处理都集中在少数节点上.&qu ...
- 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++
C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...
最新文章
- 适合初学者学java技术的书籍推荐!
- 分享|如何制作高质量的图文摘要(Graphical Abstract)
- opencv 学习笔记9:图像缩放与图像翻转
- 基于mysql的主从复制之Mycat简单配置和高可用
- 网络游戏server编程,第一章笔记
- python 示例_Python使用示例设置add()方法
- 顺丰不行了吗?对快递行业的深度理解
- python中列表的查_每日一记----python中的列表【查询和插入】
- 自动化运维 Shell
- 网络通信基础(入门知识总结)
- 非参数统计——第二章 单样本问题
- 骨科手术ICD编码主要缺陷与原因分析
- Ubuntu 配置磁盘挂载到指定目录
- html 打开资源管理器,资源管理器怎么打开 教你如何快速打开资源管理器
- 叮咚叮咚,京东叮咚音箱Skill开发之路
- macOS安装MySQL,使用Navicat连接MySQL数据库/2022
- 台式计算机如何升级,老电脑如何升级 老电脑升级方法【详细介绍】
- html 获取声音频谱,[前端]利用WebAudioAPI获取音频频谱(html5音频可视化)
- 电脑安装android4.0虚拟机,尝鲜Android 4.0 PC端虚拟机安装指南
- HDU--2602--Bone Collector 【01背包】