socket网络课程设计报告
- 格式:doc
- 大小:100.50 KB
- 文档页数:15
编写socket通信程序课程设计一、课程目标知识目标:1. 理解Socket通信的基本概念,掌握网络编程的相关知识;2. 学会使用Socket API编写客户端和服务器端通信程序;3. 了解网络协议(TCP/IP)的基本原理,并能在编程中正确应用;4. 掌握基本的异常处理和程序调试技巧。
技能目标:1. 能够独立设计并编写简单的Socket通信程序;2. 能够运用所学知识解决实际网络通信问题;3. 具备基本的网络编程调试能力,能对程序进行优化和改进;4. 提高学生的编程实践能力和问题解决能力。
情感态度价值观目标:1. 培养学生积极探索、勇于实践的精神,增强学生对网络编程的兴趣;2. 培养学生的团队协作意识,提高沟通与表达能力;3. 增强学生的网络安全意识,树立正确的网络道德观念;4. 使学生认识到编程知识在现代社会中的重要性,激发学生的学习热情。
课程性质:本课程为计算机网络编程的实践课程,旨在让学生通过动手实践,掌握网络编程的基本知识和技能。
学生特点:学生已具备一定的编程基础,熟悉C或Java等编程语言,对网络通信有一定的了解。
教学要求:结合学生特点,注重理论与实践相结合,以项目为导向,培养学生的实际编程能力和解决问题的能力。
在教学过程中,关注学生的个体差异,提供有针对性的指导,确保课程目标的达成。
通过课程学习,使学生能够独立完成Socket通信程序的编写和调试。
二、教学内容1. 网络编程基础知识- 网络协议(TCP/IP)原理- IP地址、端口号、域名解析等基本概念2. Socket编程基本概念- Socket的定义与作用- 套接字类型(流式套接字、数据报套接字等)- Socket API介绍3. 客户端与服务器端编程- 客户端程序设计方法- 服务器端程序设计方法- 客户端与服务器端通信流程4. 编程实践- 使用C或Java等编程语言实现Socket通信- 编写简单的聊天程序、文件传输程序等案例5. 异常处理与调试技巧- 常见异常类型及处理方法- 网络编程中的调试技巧6. 网络安全与网络道德- 网络安全基础知识- 网络道德规范教学内容安排与进度:第1周:网络编程基础知识,学习网络协议原理及基本概念第2周:Socket编程基本概念,了解Socket API及其使用方法第3周:客户端与服务器端编程,学习编程方法和通信流程第4周:编程实践,动手编写Socket通信程序第5周:异常处理与调试技巧,学习调试方法和优化程序第6周:网络安全与网络道德,提高网络安全意识和网络道德观念教学内容与教材关联性:本教学内容紧密结合教材,按照教材章节顺序进行组织和安排,确保学生能够系统地学习网络编程知识。
学生学号实验课成绩武汉理工大学学生实验报告书实验课程名称高性能计算机网络实验题目基于Socket的网络聊天程序设计指导老师姓名学生姓名学生专业班级2011 —2012 学年第一学期实验课程名称:高性能计算机网络第一部分:实验分析与设计一、实验内容描述(问题域描述)内容:综合运用网络协议、编程语言、API和图形界面实现基于socket建立、监听、连接、发送数据和接收数据的网络通信程序。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)本程序采用基于面向无连接的UDP协议。
需要用到的函数有bind()、 sendto()、 recvfrom()等设计一个基本的网络服务器有以下几个步骤:1、初始化Windows Socket2、创建一个监听的Socket3、设置服务器地址信息,并将监听端口绑定到这个地址上4、开始监听5、接受客户端连接6、和客户端通信7、结束服务并清理Windows Socket和相关数据,或者返回第4步客户端程序框架类似三、主要仪器设备及耗材Windows XP 操作平台Microsoft Visual C++ 6.0 开发环境第二部分:实验调试与结果分析一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)上机前编写好代码,用VC 6.0 编译时发现出现链接错误二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)经分析,应该在“工程”-“设置”-“连接”下的“对象/库模块”中添加“ws2_32.lib”在运行时应该先启动服务器端程序,再启动客户端程序。
源代码以及运行结果截图见附页。
三、实验小结、建议及体会通过本次实验,巩固了自己的编程能力,把课堂上学习到的通信协议用到了实践中,对于各种通信协议的理解很有好处。
不足的的对于图形界面编程能力不足,今后应该在这方面多多下功夫。
服务器端代码:#include <stdio.h>#include <WINSOCK2.H>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData );if (err != 0 ){return;}if (LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1){WSACleanup();return;}SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6666); //设置端口号为6666 bind(sockSrv, (sockaddr*)&addrSrv, sizeof(sockaddr));char sendBuf[100];char recvBuf[100];char tempBuf[200];int len = sizeof(sockaddr);SOCKADDR_IN addrClient;while(1){recvfrom(sockSrv, tempBuf, strlen(tempBuf), 0,(sockaddr*)&addrClient, &len);if('q' != tempBuf[0]){sprintf(recvBuf, "%s say: %s", inet_ntoa (addrClient.sin_addr), tempBuf);printf("%s\n", recvBuf);printf("please input your data: ");gets(sendBuf);sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*) &addrClient, len);}else // 若接收到'q',则退出聊天{printf("%s request to quit the chat platform.\n",inet_ntoa(addrClient.sin_addr));sendto(sockSrv, "q", strlen("q") + 1, 0, (sockaddr*)&addrClient, len);break;}}closesocket(sockSrv);WSACleanup();}客户端代码:#include <stdio.h>#include <WINSOCK2.H>void main(){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){return;}if(LOBYTE(wsaData.wVersion) != 1 ||HIBYTE(wsaData.wVersion) != 1 ){WSACleanup();return;}SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//htonl htons inet_addr inet_ntoaaddrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6666); //设置同样的端口号6666 char sendBuf[100];char tempBuf[200];char recvBuf[100];int len = sizeof(sockaddr);while(1){printf("please input your data: ");gets(sendBuf);sendto(sockClient, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr*)&addrSrv, len);recvfrom(sockClient, tempBuf, strlen(tempBuf), 0, (sockaddr*)&addrSrv, &len);if('q' != tempBuf[0]){sprintf(recvBuf, "%s say: %s", inet_ntoa(addrSrv.sin_addr), tempBuf);printf("%s\n", recvBuf);}else // 若接收到'q',则退出聊天{printf("the server has been closed!\n");sendto(sockClient, "q", strlen("q") + 1, 0, (sockaddr*)&addrSrv, len);break;}}closesocket(sockClient);WSACleanup();}运行结果截图:。
c socket课程设计一、课程目标知识目标:1. 理解Socket通信的基本概念,掌握客户端与服务器端的通信原理;2. 学会使用C语言实现Socket编程,掌握相关函数的使用方法;3. 了解网络通信协议,理解IP地址、端口号等概念。
技能目标:1. 能够独立编写简单的C语言客户端和服务器端程序,实现数据的收发;2. 学会使用调试工具分析Socket通信过程中可能出现的问题;3. 培养学生的实际操作能力,提高解决问题的技巧。
情感态度价值观目标:1. 培养学生对网络编程的兴趣,激发学习积极性;2. 培养学生的团队协作精神,学会与他人共同解决问题;3. 增强学生的信息安全意识,了解网络安全的重要性。
本课程针对的是高年级学生,他们已经掌握了C语言基础知识,具备一定的编程能力。
课程性质为实践性较强的学科,要求学生在学习过程中能够将理论知识与实际操作相结合。
通过本课程的学习,期望学生能够掌握Socket编程的基本方法,提高网络编程能力,培养良好的编程习惯和团队协作精神。
后续教学设计和评估将围绕上述具体学习成果展开。
二、教学内容1. 网络通信基本概念:介绍网络通信的基本原理,包括TCP/IP协议、IP地址、端口号等。
教材章节:第一章 网络编程基础2. Socket编程原理:讲解Socket的概念、类型和通信流程。
教材章节:第二章 Socket编程基础3. C语言Socket编程实践:a. 客户端编程:使用C语言实现客户端程序,掌握socket、connect、send、recv等函数的使用;b. 服务器端编程:使用C语言实现服务器端程序,掌握socket、bind、listen、accept等函数的使用;教材章节:第三章 C语言Socket编程4. 网络通信协议分析:介绍常用的网络通信协议,如TCP、UDP等,分析其特点和适用场景。
教材章节:第四章 网络通信协议5. 调试与优化:教授如何使用调试工具(如Wireshark)分析网络通信问题,并进行程序优化。
计算机网络socket编程实验报告
实验报告
黑龙江大学教务处
黑龙江大学计算机科学与技术专业、软件工程专业
《计算机网络》课程实验报告
学号20111913 姓名陈声晓班级1班
实验时间 4.16-4.30第1节-第2节
实验名称Socket通信
实验内容在一台计算机上实现两个程序的通信
一、实验目的
掌握Windows通信程序的编写,通信原理,实际编写通信程序,本试验是后续实验的基础。
做到在一台计算机上实现两个程序的通信。
二、实验环境
Windows xp/7
三、主要设计思想与算法
1.服务器创建socket,并规定通信的端口号(大于1024),等待客户端的连接。
2.客户端创建socket,通过端口号连接服务端。
3.客户端向服务端发送接收数据。
4.服务端接收发送数据。
5.通信结束,客户端和服务端关闭socket。
6.Socket通信流程:
四、实验结果(测试用例、实验结果)
五、实验总结
计算机网络通信利用java语言编写时,用到的技术室socket技术。
任何一个socket程序都至少包含客户端程序和服务端程序。
通过IP地址和端口号,实现了两台计算机之间的链接,然后才可以根据具体需要实现通信。
运行时先运行服务器程序,不难理解,客户端没有开放,就无法连接。
实验报告实验一 socket编程一、实验目的通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与serversocket类。
二、实验内容①学习socket编程使用的类和接口,着重掌握基于tcp协议的socket。
②编写服务器端的应用程序③编写客户端的应用程序④实现服务器端与客户端的交互三、实验代码1.服务器端程序过程:在端口5000上创建一个等待连接的serversocket对象server:server=newserversocket(5000);接着调用server对象的accept()方法等待某客户程序发出连接请求。
该方法一直阻塞直到有客户连接到带端口。
一旦有客户发送正确请求,则连接成功,accept()方法返回一个socket对象,于是得到了一个新的用于通信的socket对象,通信链路建立成功。
然后利用socket类提供的方法创建socket对象的输入流和输出流。
此后即于客户端进行通信,直到客户端断开连接即关闭各个流结束通信。
代码如下:import .*;import java.io.*;class aa{static public void main (string args[]) throws ioexception {serversocket server=null;socket socket=null;inputstream is=null;outputstream os=null;datainputstream in=null;printstream out=null;try{ //在端口5000注册服务server=new serversocket(5000); socket =server.accept();//侦听连接请求,等待连接system.out.println(**********************服务器端界面*************************);system.out.println(与客户端连接成功!); system.out.println();system.out.println(对话内容为:); system.out.println();system.out.println(等待客户发送信息.....); //获取对应的socket的输入/输出流is=socket.getinputstream();os=socket.getoutputstream(); //建立数据流in= new datainputstream(is); out =new printstream(os);//表示向对方输出string str=in.readline();//逐行读取do{system.out.println(客户端说:+ str); str=in.readline();}while(str.trim().equals(bye)) //如果是“bye”就退出system.out.println(客户想要离开); }catch(exception e) //捕获程序异常{system.out.println(error:+e); }finally{is.close();//关闭输入流os.close();//关闭输出流in.close();//关闭数据输入流socket.close();//关闭socket }}}2.客户端程序过程:首先创建一个指向服务器的指定端口号(5000)的socket对象socket:socket=newsocket(localhost,5000);此时服务器指定为本地计算机,若要在网络中指定服务器,只需要将参数localhost改成相应的服务器名或者ip地址即可。
计算机网络课程设计报告网络连天程序的设计与实现姓名: 李坚学号: 0855010206班级:计算机002指导老师:文宏湖南科技大学计算机科学与工程学院2011年9月一、课程设计题目利用Windows Socket编程实现局域网的聊天程序,要求能实现消息的发送和接收,以及聊天软件的细节问题。
二、题目分析拿到题目之后先来了解windows socket连接的过程与相关的API 函数。
按照题目的要求,我简单的分析了下并做了初步的设计:利用tcp协议建立连接,这样服务器和客户端分离,服务端先启动并监听端口,客户端启动之后连接服务端建立连接,接着收发聊天信息。
当任意一方连接断开的时候给出适当的提示并结束程序。
因为功能比较简单,所以设计起来还是比较容易的.实际的操作中我遇到了很多新奇的问题并通过一些方案修改或者实现了最终的功能。
三、设计步骤1、熟悉网络编程概念以及一些基本知识2、在windows 的编程环境下熟悉了常用socket函数3、先整体再局部顺序设计程序4、调试并修改程序,使之实现设计要求5、测试程序,从中找出程序缺陷和可改进内容6、重复修改和测试,以达到自己理想的功能7、程序评定测试8、撰写设计报告四、设计过程第一个版本并未实现收发同步,只是简单的阻塞式通信。
因为没有用到多线程,所以在程序监听网络数据写入时不能监听键盘输入,所以只能发一条后接一条,其中的问题可想而知。
第二个版本用多线程实现了同时收发问题,在连接建立后新建一个线程用来等待键盘输入,而主体线程等待网络输入,当网络输入错误时(连接断开),结束线程并作下一步处理。
这个版本就上个版本改进很多,主要可以即时在屏幕输出接收到的消息,同时也出现了另外一个缺陷:当键盘输入到一半时程序收到了网络的信息,这个时候程序的做法是直接输出这条信息,这导致我们键盘输入的信息被切断,很不人性化。
第三个版本,也就是目前评测的版本,这个版本利用临界值来锁定屏幕资源,让程序在同一时刻只能一个程序拥有屏幕控制权,这样保证了不会交叉显示.另外我用自己的输入输出代替了原有的scanf 和printf,这样使读写更安全可靠。
基于C/S结构的套接字程序设计----通过socket实现服务端功能学院:信息技术工程学院 _ 专业:计算机科学与技术 _ 班级: *班 _姓名:陈***学号: 0123456789指导老师: *** 开课时间:2014年1月12日到1月16日摘要基于C/S结构的套接字程序设计,采用了Client/Server模型, 程序基于TCP协议,通过socket接口来实现的。
服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。
当连接成功之后,客户端就可以向服务器端发送数据或接收来自服务器的的数据。
在传输过程中如果出现错误会返回错误信息,并对该信息做出诊断。
引言1、目的及要求(1)目的和意义通过编程了解C/S结构的网络通信模型;掌握基于C/S结构的Windows Socket TCP的程序设计方法。
(2)基本要求按照C/S模型编写两个程序。
一个为客户端程序,另一是服务器端程序;对于C/S两端都应输出必要的日志、出错或诊断信息。
2、研究设想能够实现当客户端向服务器端发送请求时,通过TCP协议(传输控制协议)服务器端能够响应,并能与客户端进行通信。
3、相关理论TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。
TCP协议在网络层IP 协议的基础上,向应用层用户进程提供可靠地全双工的数据流传输。
并且通过创建的流式套接字实现服务端与客户端的数据传送。
流式套接字(SOCK--STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。
而且发送的数据是按顺序接收的。
所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。
这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。
4、预期结果通过运用套接字,实现服务器端与客户端的数据传送。
《网络编程》实验报告实验序号:02 实验项目名称:Socket编程学号姓名专业、班20网络工程实验地点指导教师实验时间2022一、实验目的及要求掌握Socket编程的基本原理,调试并在代码标注注释:(1) ServerSocket, ClientSocket(2) SimpleClient, SimpleServer(3) PortScanner(4) Sender, Receiver(5) SenderClient, ReceiverSever二、实验设备(环境)及要求一台Windows XP、JDK1.6、MyEclipse 8.5三、实验内容与步骤1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。
3.第三个实验是扫描1-1024端口有没有被服务器监听。
4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。
3.第三个实验是扫描1-1024端口有没有被服务器监听。
4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理附源程序清单:1. EchoServerpackage Hello;import java.io.*;import .*;public class EchoServer {private int port=8000;//监听端口号private ServerSocket serverSocket;public EchoServer() throws IOException {serverSocket = new ServerSocket(port);//创建一个SocketSystem.out.println("服务器启动");}public String echo(String msg) {return "echo:" + msg;}private PrintWriter getWriter(Socket socket)throws IOException{////参数socket 表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream();//获得输入流,获得用户的请求//数据流输入return new BufferedReader(new InputStreamReader(socketIn));}public void service() {while (true) {Socket socket=null;try {socket = serverSocket.accept(); //等待客户连接System.out.println("New connection accepted "+socket.getInetAddress() + ":" +socket.getPort());BufferedReader br =getReader(socket);PrintWriter pw = getWriter(socket);String msg = null;while ((msg = br.readLine()) != null) {System.out.println(msg);pw.println(echo(msg));if (msg.equals("bye")) //如果客户发送消息为“bye”,就结束通信break; }}catch (IOException e) {e.printStackTrace();}finally {try{if(socket!=null) socket.close(); //断开连接}catch (IOException e) {e.printStackTrace();}} } }// service() 方法结束public static void main(String args[])throws IOException {new EchoServer().service();}}import .*;import java.io.*;import java.util.*;public class EchoClient {//创建客户端private String host="localhost";//当参数host 的取值为“localhost”,表示EchoClient与EchoServer进程运行在同一个主机上private int port=8000;//监听端口号8000private Socket socket;public EchoClient()throws IOException{socket=new Socket(host,port); //建立连接}public static void main(String args[])throws IOException{//输入输出new EchoClient().talk();}private PrintWriter getWriter(Socket socket)throws IOException{//发送数据OutputStream socketOut = socket.getOutputStream();//获得输出流return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream(); //获得输入流return new BufferedReader(new InputStreamReader(socketIn));}public void talk()throws IOException {try{BufferedReader br=getReader(socket);PrintWriter pw=getWriter(socket);BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));String msg=null;while((msg=localReader.readLine())!=null){pw.println(msg);System.out.println(br.readLine());if(msg.equals("bye"))break;}}catch(IOException e){e.printStackTrace();}finally{//关闭流和连接try{socket.close();}catch(IOException e){e.printStackTrace();} }}}2. .SimpleClientimport java.io.*;import .*;public class SimpleClient {public static void main(String args[])throws Exception {Socket s1 = new Socket("localhost",8000);System.out.println("第一次连接成功");Socket s2 = new Socket("localhost",8000);System.out.println("第二次连接成功");Socket s3 = new Socket("localhost",8000);System.out.println("第三次连接成功");}package Hello;import java.io.*;import .*;public class SimpleServer {public static void main(String args[])throws Exception {ServerSocket serverSocket = new ServerSocket(8000,2); //连接请求队列的长度为2Thread.sleep(360000); //睡眠6分钟}}3. import .*;import java.io.*;public class PortScanner { public static void main(String args[]){String host="localhost";//当参数host 的取值为“localhost”,表示Client与Server进程运行在同一个主机上if(args.length>0)host=args[0];new PortScanner().scan(host);}public void scan(String host){//扫描1-1024端口Socket socket=null;for(int port=1;port<1024;port++){try {//try catch语句判断输出socket = new Socket(host, port);System.out.println("There is a server on port "+port);//如果有连接There is a server on port,} catch (IOException e) {System.out.println("Can't connect to port "+port);//如果没有连接Can't connect to port} finally {try {if(socket!=null)socket.close();//断开连接} catch (IOException e) {e.printStackTrace();}}}}4. Senderimport java.io.*;import .*;public class Receiver { private int port=8000;private ServerSocket serverSocket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int INPUT_STOP=4; //关闭输入流,再结束程序private final int SERVERSOCKET_STOP=5; //关闭ServerSocket,再结束程序public Receiver() throws IOException {serverSocket = new ServerSocket(port);System.out.println("服务器已经启动");}private BufferedReader getReader(Socket socket)throws IOException{ InputStream socketIn = socket.getInputStream();return new BufferedReader(new InputStreamReader(socketIn));}public void receive() throws Exception{Socket socket=null;socket = serverSocket.accept();BufferedReader br =getReader(socket);for(int i=0;i<20;i++) {String msg=br.readLine();System.out.println("receive:"+msg);Thread.sleep(1000);if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");socket.close();break;}else if(stopWay==INPUT_STOP){System.out.println("关闭输入流并终止程序");socket.shutdownInput();break;}else if(stopWay==SERVERSOCKET_STOP){System.out.println("关闭ServerSocket并终止程序");serverSocket.close();break;}}}if(stopWay==NA TURAL_STOP){socket.close();serverSocket.close();}}public static void main(String args[])throws Exception {if(args.length>0)stopWay=Integer.parseInt(args[0]);new Receiver().receive();}}Receiverimport .*;import java.io.*;import java.util.*;public class Sender {private String host="localhost";private int port=8000;private Socket socket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int OUTPUT_STOP=4; //关闭输出流,再结束程序public Sender()throws IOException{socket=new Socket(host,port);}public static void main(String args[])throws Exception{if(args.length>0)stopWay=Integer.parseInt(args[0]);new Sender().send();}private PrintWriter getWriter(Socket socket)throws IOException{ OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}public void send()throws Exception {PrintWriter pw=getWriter(socket);for(int i=0;i<20;i++){String msg="hello_"+i;pw.println(msg);System.out.println("send:"+msg);Thread.sleep(500); //捕捉异常if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");//输出System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");//输出socket.close();break;}else if(stopWay==OUTPUT_STOP){socket.shutdownOutput();System.out.println("关闭输出流并终止程序");//输出break;}}}if(stopWay==NATURAL_STOP){socket.close();}}}5 SendClientimport java.io.*;import .*;public class SendClient {public static void main(String args[])throws Exception {Socket s = new Socket("localhost",8000);OutputStream out=s.getOutputStream();out.write("hello ".getBytes());out.write("everyone".getBytes());Thread.sleep(60000); //睡眠1分钟s.close();}}package Hello;import java.io.*;import .*;public class ReceiveServer { public static void main(String args[])throws Exception { ServerSocket serverSocket = new ServerSocket(8000);Socket s=serverSocket.accept();//s.setSoTimeout(20000);InputStream in=s.getInputStream();ByteArrayOutputStream buffer=new ByteArrayOutputStream();byte[] buff=new byte[1024];int len=-1;do{try{len=in.read(buff);if(len!=-1)buffer.write(buff,0,len);}catch(SocketTimeoutException e){System.out.println("等待读超时");len=0;}}while(len!=-1);System.out.println(new String(buffer.toByteArray())); //把字节数组转换为字符串}}。
*****《软件综合开发案例教程》课程设计报告课程设计题目小组成员:**,**,**,**任课讲师和助教:**,**2014年 10 月 29 日摘要这个课程设计整体采用在linux平台下,在同一局域网内实现聊天功能。
整体框架主要分为服务端和客户端两个部分,设置好ip和端口号,在Linux下编译和调试两主大块程序,实现服务端和客户端的连接,然后以服务端作为中继转实现客户端之间的通信。
使用socket网络编程采用TCP/IP协议保证连接可靠,并在项目管理中采用linux流行的gcc和makefile编译,提高了编译和调试效率,加快了项目的完成速度。
本次设计的聊天工具采用字符串命令行的方式进行通信,主要实现了五个功能:用户之间一对一的聊天、编辑、换行、用户之间聊天记录保存、聊天记录调取。
经过测试,程序运行可靠,能满足在linux中实现网络聊天的要求。
关键词 linux,socket,gedit,服务端,客户端,网络编程AbstractThe course design of the overall use in the Linux platform, within the same LAN chat functions.Overall framework consists of server and client two parts, set up IP and port number, two main large program under Linux compiling and debugging, to connect server and client, and then turn to the server as a relay to realize the communication between the e the socket network programming using TCP/IP protocol to ensure reliable connect, and using Linux popular GCC in project management and compile a makefile, improve the efficiency of the compiling and debugging, to speed up the completion of the project.The design way of chat tool USES the string on the command line to communicate, has realized the five main functions: the one-on-one chat between users, editing, line feeds, chat records, chat records obtained between users.After testing, the program runs, reliable and can meet the requirements of the implementation in the Linux network chat. Keywords Linux, socket, gedit, server, client, network programming目录摘要 (II)Abstract (II)第一章绪论.......................................................................................... - 1 -1.1、背景......................................................................................... - 1 -1.2、网络聊天的发展状况 ............................................................ - 1 -1.3、Linux系统............................................................................ - 2 -1.3.1 、Linux的简介............................................................... - 2 -1.3.2 、Linux发展历程........................................................... - 3 - 第二章系统应用技术 ......................................................................... - 4 -2.1 、socket概念及功能 ............................................................... - 4 -2.2、socket类型 ........................................................................... - 5 -2.3 、socket函数 ........................................................................... - 5 -2.3.1 、API功能介绍.............................................................. - 5 -2.3.2、套接口地址结构 ........................................................... - 7 -2.3.3、基本转换函数 ............................................................... - 8 -2.3.4、socket编程流程 ............................................................ - 8 -2.4、TCP/IP 协议......................................................................... - 10 -2.4.1、协议概述 ..................................................................... - 10 -2.4.2、TCP/IP层次结构 ........................................................ - 10 - 第三章需求分析 ............................................................................... - 13 -3.1 、功能需求 ............................................................................ - 13 -3.2、性能需求 .............................................................................. - 13 -3.3 、模块划分 ............................................................................ - 13 -3.3.1、界面需求设计 ........................................................... - 14 -3.3.2 、通信需求 ................................................................... - 14 -3.3.3 、数据存储 ................................................................... - 14 -3.4、系统总流程图 ...................................................................... - 14 - 第四章系统测试 ............................................................................... - 15 -4.1、测试说明 .............................................................................. - 15 -4.2、模块测试 .............................................................................. - 15 -4.3、测试结果分析 ...................................................................... - 16 - 第五章设计和实现 ........................................................................... - 16 -5.1、窗体的设计 .......................................................................... - 16 -5.2、实现服务器与客户端的连接 .............................................. - 17 -5.3、聊天功能 .............................................................................. - 18 -5.4、编辑功能的实现 .................................................................. - 19 -5.5、换行功能的实现 .................................................................. - 20 -5.6、数据库的创建与连接 .......................................................... - 21 -5.6.1、MySQL数据库的简介 ............................................... - 21 -5.6.2、MYSQL环境搭建 ...................................................... - 21 -5.7 、显示聊天记录 .................................................................... - 23 -结论................................................................................................ - 25 - 致谢................................................................................................ - 26 -第一章绪论1.1、背景随着Internet的快速发展和普及,网络已经遍布世界各个角落。
第一篇:计算机网络实验报告(路由算法、Socket编程)计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。
二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。
通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。
举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。
假设一个路由器接收到来自邻居x的一个列表,其中x(i)表示x估计的到达路由器i所需要的时间。
如果该路由器知道他到x的延时为m毫秒,那么他也知道在x(i)+m毫秒之间内经过x可以到达路由器i。
一个路由器针对每个邻居都执行这样的计算,就可以发现最佳的估计值,然后在新的路由器表中使用这个最佳的估计值以及对应的输出路线。
三.源程序:#include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "graphics.h" #include "dos.h" #define VERNUM 7typedef struct {int dis;int flag;int flag2; }RoutNode;char tmp[10]; RoutNode data[VERNUM][VERNUM];void welcome();void InitRoutData(FILE* pfile);void PrintRoutData();void SendInf(int recv, int send);void Exchange();int main() {int start, end, i, j, m, n;FILE *pfile;welcome();pfile = fopen("1.txt", "r");if (pfile == NULL){printf("the file wrong,press any key to come back.\n"); getch();return;}elseInitRoutData(pfile);fclose(pfile);printf("\nthe original route table:\n");for (i = 0; i{printf("%c||", i + 65);for (j = 0; j < VERNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);}PrintRoutData();getch();for (i = 0; i < VERNUM; i++){for (m = 0; m < VERNUM; m++)for (n = 0; n < VERNUM; n++)data[m][n].flag = 0;Exchange();PrintRoutData();getch();}printf("\nexchange the route table:\n"); return 0; }void welcome() {int gdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver); initgraph( &gdriver, &gmode,"C:\Win-TC"); cleardevice();setbkcolor(CYAN);setviewport(0,0,639,479,1); clearviewport();setbkcolor(BLUE);rectangle(200,200,440,280);setfillstyle(1,5);floodfill(300,240,14);settextstyle(0,0,2);outtextxy(50,30,"Distance Vector Routing Algorithm"); setcolor(15);settextstyle(1,0,4);outtextxy(260,214,"Welcome to use!");line(0,80,640,80);getch();delay(300);cleardevice(); } void InitRoutData(FILE* pfile) {char num[10];int i = 0;char c;int m, n;fseek(pfile, 0, 0);for (m = 0; !feof(pfile) && m < 7; m++){for (n = 0; !feof(pfile) && n < 7; n++){while (!feof(pfile)){c = fgetc(pfile);if (c == ','){num[i] = '\0';data[m][n].dis = atoi(num); data[m][n].flag = 0;data[m][n].flag = 0;i = 0;break;} /*end of if*/else if ((c >= '0' && c{num[i++] = c;} /*end of else if*/} /*end of while*/} /*end of for (n = 0*/} /*end of for (m = 0*/ } void PrintRoutData() {int i, j;for (i = 0; i < VERNUM; i++) {settextstyle(1,0,3);sprintf(tmp," %c",i + 65); outtextxy(i*80+50,130,tmp);outtextxy(10,160+i*40,tmp);}for (j = 0; j< VERNUM; j++){for (i = 0; i < VERNUM; i++){if (data[i][j].dis{if(data[i][j].flag2 ==1){setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185); delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2);sprintf(tmp,"-");outtextxy(80*i+65,40*j+165,tmp);}elseif(data[i][j].dis >=0){{setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185);delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185); settextstyle(1,0,2);sprintf(tmp,"%d",data[i][j].dis);outtextxy(80*i+65,40*j+165,tmp);}} /*end of for (j = 0*/} /*end of for (i = 0*/ }void SendInf(int recv, int send) {int i;for (i = 0; i < VERNUM; i++){if (data[send][i].dis > 0&& data[send][i].flag!=1){if (data[recv][i].dis{data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag2 =1;}else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis) {data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag =1;data[recv][i].flag2 =1;}} /*end of if*/} /*end of for*/ }void Exchange() {int i, j;for (i = 0; i < VERNUM; i++){for (j = 0; j < VERNUM; j++){if (data[i][j].dis > 0&& data[i][j].flag!=1){SendInf(i, j);} /*end of if*/} /*end of for (j = 0*/} /*end of for (i = 0*/ }四、实验心得体会通过本次实验训练,我了解了距离矢量路由算法的基本原理,复习了C语言编程的内容,通过对路由算法的实现,加深了对路由表交换的理解。
(计算机学院)网络应用课程设计报告题目:基于Socket仿微信系统专业名称:网络工程1101班级:学生姓名:学号(8位):指导教师:设计起止时间:2014年6月16日~2014年6月27日一. 设计目的1.掌握网络应用设计的方法和步骤;2.掌握用户需求分析的方法和设计文档的编制方法;3.掌握应用开发辅助软件的使用方法;4.掌握数据库设计方法;5.掌握通信协议的特点,消息格式设6.掌握软件测试的基本流程。
二. 设计内容随着网络的快速发展,社交网站也变得越来越普及,人们不必再去花费大量的时间和精力去参加社交活动所,只要通过互联网便可拥有自己的朋友圈。
仿微信系统基于Socket实现C/S架构完成系统搭建,安卓端作为客户端,服务器端采用多线程响应每个客户端,在服务器端有用户注册到数据库,存储转发客户端相关消息。
客户端界面与功能完成微信官方客户端的部分常用功能,包括语音实现,消息实现,图片实现等。
主要完成一个具有实用价值的网络应用程序,该应用中应包括:图形化界面、套接字通信、多线程处理、相应的业务处理逻辑等。
对于该系统:第一,通讯基础模块的快和省。
手机社交产品种类很多,包括手机IM、SNS、图片分享、位置交友等。
而这些社交产品都有一共同的功能:通讯,这是手机社交产品最为基础的功能。
而用户对通讯的要求非常简单,那就是要快和省。
因此所有手机社交类产品开发准则第一条就是:通讯基础模块的快和省。
如果没有这一基础,其他的功能都妄谈。
第二,交互设计要轻和简洁由于社交类应用,都牵扯到用户的交互,而交互的设计必须轻和省。
所谓轻,就是要尽可能减少产品的层次,最好只有一层,并可以通过滑动触控迅速在各功能之间切换;所谓省,就是要求一步可以完成的操作,不要让用户做2步。
目前,新浪微博手机客户端的交互就存在很大问题。
由于评论与转发分别提醒用户,导致一个内容用户看2次,刷新2次微博,浪费时间和流量,没有做到轻;而评论功能,则需要做2步才可以完成,没有做到省。
计算机网络课程设计报告题目:网络聊天程序的设计与实现姓名:申超明学号:0705010313班级:计算机3班指导老师:文宏湖南科技大学计算机科学与工程学院2010年9月一:实验名称网络聊天程序的设计与实现二:实验目的了解Socket通信的原理,并通过程序实现通信的过程。
三:实验要求熟悉Socket程序通信过程,熟悉在通信过程中流之间的转换。
程序中熟悉灵活运用线程执行相关操作。
四:实验原理Socket通信的原理还是比较简单的,它大致分为以下几个步骤。
服务器端的步骤如下:建立服务器端的Socket,开始侦听整个网络中的连接请求。
当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。
当完成通信后,服务器关闭与客户端的Socket连接。
客户端的步骤如下:建立客户端的Socket,确定要连接的服务器的主机名和端口。
发送连接请求到服务器,并等待服务器的回馈信息。
连接成功后,与服务器进行数据的交互。
数据处理完毕后,关闭自身的Socket连接。
五:程序截图:图1-服务器端启动服务器图2-客户端连接数据库图3-客户端发送消息图4-服务器段接收客户端发送过来的消息六:程序代码:Qserver.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using ;using .Sockets;using System.Threading;namespace WindowsApplication2{public partial class qserver : Form{public qserver(){InitializeComponent();}private string ipv4;private void Form1_Load(object sender, EventArgs e){IPAddress[] ip = Dns.GetHostAddresses(Dns.GetHostName());ipv4 = ip[0].ToString();bel4.Text = ipv4;}TcpListener tcpls;Socket sk;NetworkStream ns;StreamReader sr;StreamWriter sw;Thread tred;private void button1_Click(object sender, EventArgs e){tcpls = new TcpListener(1235);tcpls.Start();MessageBox.Show("服务器已启动");this.button1.Enabled = false;sk = tcpls.AcceptSocket();MessageBox.Show("客户端已连接");ns = new NetworkStream(sk);sr = new StreamReader(ns, Encoding.UTF8);sw = new StreamWriter(ns, Encoding.UTF8);}string smessage = "";private void button2_Click(object sender, EventArgs e){this.textBox1.Focus();tred = new Thread(new ThreadStart(this.acceptcm));tred.Start();this.textBox2.Focus();}private void button3_Click(object sender, EventArgs e){sendtoc();this.textBox2.Focus();}private void textBox2_KeyPress(object sender, KeyPressEventArgs e) {if (e.KeyChar == '\r')sendtoc();}private void acceptcm(){lock (this){try{if (sr.ReadLine() != null){this.textBox1.Text += sr.ReadLine();}elsereturn;}catch (System.Exception ex){}finally{tred.Abort();}}}public void sendtoc(){try{smessage = "\r\n" + this.textBox3.Text + "(" + DateTime.Now.ToLongTimeString() + ")" + " " + this.textBox2.Text;this.textBox1.Text += smessage;this.textBox2.Clear();sw.WriteLine(smessage);sw.Flush();}catch{MessageBox.Show("服务器端错误");}}private void qserver_FormClosed(object sender, FormClosedEventArgs e){if (tcpls != null)tcpls.Stop();//if (tred != null)// tred.Abort();Application.Exit();}}}客户端代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using ;using .Sockets;using System.Threading;namespace Client{public partial class qclient : Form{public qclient(){InitializeComponent();}TcpClient tcpct;NetworkStream ns;StreamReader sr;StreamWriter sw;Thread trdc;/// <summary>/// 连接服务器操作,发送socket请求/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){try{string ip = this.textBox4.Text + "." + this.textBox5.Text + "." + this.textBox6.Text + "." + this.textBox7.Text;tcpct = new TcpClient(ip, 1235);ns = tcpct.GetStream();sr = new StreamReader(ns);sw = new StreamWriter(ns);this.button1.Enabled = false;}catch{MessageBox.Show("请确认是否开启服务器...");}}string cmessage = "";/// <summary>/// 发送消息事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){try{sendtos();}catch{// MessageBox.Show("出错啦!"+"\r\n"+"1.你是否已经连接服务器?"+"\r\n"+"2.等待服务器发回消息.");}finally{this.textBox2.Focus();}}/// <summary>/// 发送函数/// </summary>public void sendtos(){if (this.textBox2.Text == "") //发送{MessageBox.Show("内容不能为空");return;}else{cmessage = "(" + DateTime.Now.ToLongTimeString() + ")" + "\r\n" + this.textBox3.Text + this.textBox2.Text;this.textBox1.Text += cmessage;this.textBox2.Clear();// savechathistrory();sw.WriteLine(cmessage);sw.Flush();}}/// <summary>/// 接收函数/// </summary>public void acceptsm(){lock (this){try //接收{this.textBox1.Text += sr.ReadLine() + "\r\n";// savechathistrory();}catch{// MessageBox.Show("出错啦!" + "\r\n" + "1.你是否已经连接服务器?" + "\r\n" + "2.没有服务器消息.");}finally{trdc.Abort();}}}/// <summary>/// 接收消息事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){this.textBox1.Focus();trdc = new Thread(new ThreadStart(acceptsm));trdc.Start();this.textBox2.Focus();}/// <summary>/// 保存历史记录,未做./// </summary>private void savechathistrory(){StreamWriter fsw = new StreamWriter(erAppDataPath + "chathistory.txt", false, Encoding.UTF8);sw.WriteLine(this.textBox1.Text);fsw.Flush();fsw.Close();}/// <summary>/// 文件关闭之后,关闭客户端,关闭活动的线程/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void qclient_FormClosed(object sender, FormClosedEventArgs e){if (tcpct != null)tcpct.Close();Application.Exit();}/// <summary>/// 历史记录查看,未做。
计算机网络课程设计报告网络连天程序的设计与实现姓名:李坚学号: 0855010206班级:计算机002指导老师:文宏湖南科技大学计算机科学与工程学院2011年9月一、课程设计题目利用Windows Socket编程实现局域网的聊天程序,要求能实现消息的发送和接收,以及聊天软件的细节问题。
二、题目分析拿到题目之后先来了解windows socket连接的过程与相关的API 函数。
按照题目的要求,我简单的分析了下并做了初步的设计:利用tcp协议建立连接,这样服务器和客户端分离,服务端先启动并监听端口,客户端启动之后连接服务端建立连接,接着收发聊天信息。
当任意一方连接断开的时候给出适当的提示并结束程序。
因为功能比较简单,所以设计起来还是比较容易的。
实际的操作中我遇到了很多新奇的问题并通过一些方案修改或者实现了最终的功能。
三、设计步骤1、熟悉网络编程概念以及一些基本知识2、在windows 的编程环境下熟悉了常用socket函数3、先整体再局部顺序设计程序4、调试并修改程序,使之实现设计要求5、测试程序,从中找出程序缺陷和可改进内容6、重复修改和测试,以达到自己理想的功能7、程序评定测试8、撰写设计报告四、设计过程第一个版本并未实现收发同步,只是简单的阻塞式通信。
因为没有用到多线程,所以在程序监听网络数据写入时不能监听键盘输入,所以只能发一条后接一条,其中的问题可想而知。
第二个版本用多线程实现了同时收发问题,在连接建立后新建一个线程用来等待键盘输入,而主体线程等待网络输入,当网络输入错误时(连接断开),结束线程并作下一步处理。
这个版本就上个版本改进很多,主要可以即时在屏幕输出接收到的消息,同时也出现了另外一个缺陷:当键盘输入到一半时程序收到了网络的信息,这个时候程序的做法是直接输出这条信息,这导致我们键盘输入的信息被切断,很不人性化。
第三个版本,也就是目前评测的版本,这个版本利用临界值来锁定屏幕资源,让程序在同一时刻只能一个程序拥有屏幕控制权,这样保证了不会交叉显示。
目录1.前言 (4)2.需求分析 (5)系统的功能需求 (5)点歌 (5)分组管理 (5)个人信息管理 (5)…用户管理 (5)视频通话 (5)非功能需求: (5)网络安全 (5)用例分析 (6)参与者 (6)用例分析 (6)系统的用例图 (6)^3.总体设计 (8)服务器设置 (8)分析类图 (9)顺序图 (10)用户私聊顺序图 (10)用户传送文件序列图 (11)协作图 (11)用户私聊协作图 (11)>用户传送文件协作图 (12)4.详细设计 (14)客户端设计 (14)服务端设计 (14)多线程设计 (15)5.代码实现 (16)服务端设计 (16)客户端设计 (18)—多线程 (22)服务端多线程 (22)客户端多线程 (24)6.运行与测试 (25)用户登录界面 (25)输入端口界面 (25)服务器记录,在线的用户信息。
(26)私聊 (26)#登录 (26)用户给指定的好友发送信息。
(私聊) (27)指定好友接受到好友信息。
(私聊的信息) (27)好友回复我的信息 (28)群聊 (28)发送群消息 (28)好友响应并接受群聊信息 (29) (29)|7. 小结 (30)8.参考文献 (31)…1.前言-随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。
目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。
该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。
前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。
后者通过与服务器建立连接,来进行客户端与客户端的信息交流。
其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。
开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。
目录1、目录 (1)2、题目 (2)3、设计任务 (2)4、WinSocket简介及特点原理 (2)5、TCP简介及特点原理 (3)6、Visual C++简介 (7)7、设计方案 (8)8、系统的原理框图和程序流程图 (10)9、实验中的问题 (14)10、实验结果及分析 (14)11、课程设计的总结体会 (16)12、参考文献 (16)利用Socket实现双机通信一、设计任务1.利用WinSock来实现双机通信,理解TCP状态机图。
2.要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。
二、WinSocket简介及特点原理2.1、什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP 网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket 也具有一个类似于翻开文件的函数调用Socket(),该函数返回一个整型的Socket 描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常用的Socket类型有两种:流式Socket〔SOCK_STREAM〕和数据报式Socket 〔SOCK_DGRAM〕。
流式是一种面向连接的Socket,针对于面向连接的TCP效劳应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP效劳应用。
最重要的是,socket 是面向客户/效劳器模型而设计的,针对客户和效劳器程序提供不同的socket 系统调用。
计算机网络课程设计报告基于Socket在线数据传输的设计与实现数据通信与计算机网络课程设计报告指导老师;苏军学院:运算机科学学院专业:2019级电子信息科学与技术组长:学号:组员:学号:2组员:学号:基于Socket在线数据传输的设计与实现摘要近年来随着运算机技术的飞速进展,专门是Internet技术的进展,差不多深刻的改变到了人们生活的方方面面。
这时过去的种种陈旧的通讯方式,都差不多不能满足现代生活的需要。
人们期望能够用更低廉的价格,更加方便快捷的方式,来实现即时通讯。
这时开发一套基于Internet技术的网络数据传输系统变得尤为重要。
Internet是目前世界上最大的运算机互联网络,它遍布全球,并将世界各地不同规模和大小的网络连接成为一个整体。
目前基于Internet的应用差不多专门多了,例如网上收发邮件、网上购物、网上看电影等等。
这些应用无不在改变人们的生活传统生活方式。
本课题要紧研究的是基于Socket的数据传输软件,此软件分为服务器程序和客户端程序,本课题的目标是能实现用户在客户端与服务器端传递信息。
要紧研究开发内容是:熟悉系统开发平台,探究在此开发平台下,利用Socket编程技术、TCP/IP协议等进行谈天软件的实际开发。
一.课程设计性质:独立课设二.课程设计目的和任务:1、把握数据通信和运算机网络的差不多原理2、把握数据通信和运算机网络设计、分析和实现方法3、提高学生编制网络通信程序、网络应用服务程序的能力三.课程设计差不多内容及要求:差不多内容:网络数据通信的差不多方法及实现。
差不多要求:依照选定的项目,课题小组成员认真查阅相关资料,发挥学生的主体作用,提出设计方案,老师参与,进行讨论和分析,最终确定设计方案。
在此基础上,合理分工,协同完成项目的设计与实现,最后完成课程设计的报告撰写。
四.课程设计平台基于Eclipse集成开发环境五.课程设计原理:1. TCP/IP协议TCP/IP是Transmission Control Protocol/Internet Protocol 的简写,中文译名为传输操纵协议/互联网络协议,该协议是Internet 最差不多的协议,简单地说,确实是由底层的IP协议和TCP协议组成的。
计算机网络课程设计报告网络连天程序的设计与实现)姓名:李坚学号: 06班级:计算机002指导老师:文宏湖南科技大学计算机科学与工程学院!2011年9月一、课程设计题目利用Windows Socket编程实现局域网的聊天程序,要求能实现消息的发送和接收,以及聊天软件的细节问题。
二、题目分析拿到题目之后先来了解windows socket连接的过程与相关的API 函数。
按照题目的要求,我简单的分析了下并做了初步的设计:利用tcp协议建立连接,这样服务器和客户端分离,服务端先启动并监听端口,客户端启动之后连接服务端建立连接,接着收发聊天信息。
当任意一方连接断开的时候给出适当的提示并结束程序。
)因为功能比较简单,所以设计起来还是比较容易的。
实际的操作中我遇到了很多新奇的问题并通过一些方案修改或者实现了最终的功能。
三、设计步骤1、熟悉网络编程概念以及一些基本知识2、在windows 的编程环境下熟悉了常用socket函数3、先整体再局部顺序设计程序4、调试并修改程序,使之实现设计要求5、测试程序,从中找出程序缺陷和可改进内容6、)7、重复修改和测试,以达到自己理想的功能8、程序评定测试9、撰写设计报告四、设计过程第一个版本并未实现收发同步,只是简单的阻塞式通信。
因为没有用到多线程,所以在程序监听网络数据写入时不能监听键盘输入,所以只能发一条后接一条,其中的问题可想而知。
第二个版本用多线程实现了同时收发问题,在连接建立后新建一个线程用来等待键盘输入,而主体线程等待网络输入,当网络输入错误时(连接断开),结束线程并作下一步处理。
这个版本就上个版本改进很多,主要可以即时在屏幕输出接收到的消息,同时也出现了另外一个缺陷:当键盘输入到一半时程序收到了网络的信息,这个时候程序的做法是直接输出这条信息,这导致我们键盘输入的信息被切断,很不人性化。
第三个版本,也就是目前评测的版本,这个版本利用临界值来锁定屏幕资源,让程序在同一时刻只能一个程序拥有屏幕控制权,这样保证了不会交叉显示。
另外我用自己的输入输出代替了原有的scanf 和printf,这样使读写更安全可靠。
同时改进的还有等待机制,在服务器启动之后立即监听本机6000端口,建立连接之后直接开辟线程等待输入。
而客户端启动时要输入目的机的ip地址,连接完成时打印欢迎信息并开始进入聊天。
聊天结束(断开)之后可以重新输入目的机器ip地址以建立新连接。
:五、调用顺序图六、《七、源代码1、共有文件(调试用文件)#include <>void getime(char *s_tim){time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime (&rawtime );]sprintf(s_tim,"%02d:%02d:%02d",timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);return ;}2、服务端#include <>#include <>#include <>)#include <>#include ""#pragma comment(lib,"")DWORD WINAPI gotsListen(LPVOID);DWORD WINAPI setsListen(LPVOID);void geta(char *s);void puta(char*,int);~void getime(char *);CRITICAL_SECTION g_cs;CRITICAL_SECTION t_cs;char bufer[1000];int buflen;bool linked;&void main(void){HANDLE gotHandle;HANDLE setHandle;WORD wVerR;WSADATA wsD;wVerR=MAKEWORD(1,1);@if(WSAStartup(wVerR,&wsD))return ;if(LOBYTE!=1||HIBYTE!=1){WSACleanup();return ;}*SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN adrSr;=AF_INET;=htons(6000);bind(scSr,(SOCKADDR *)&adrSr,sizeof(SOCKADDR));/listen(scSr,5);SOCKADDR_IN adrCl;int len=sizeof(SOCKADDR);while(true){printf("bind[%d] success!\n",6000);SOCKET scCon=accept(scSr,(SOCKADDR *)&adrCl,&len);char s_adr[100];、strcpy(s_adr,inet_ntoa);linked=true;printf("link[%s] be created!\n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=CreateThread(NULL,0,&gotsListen,&scCon,0,NULL);setHandle=CreateThread(NULL,0,&setsListen,&scCon,0,NULL);…while(linked){Sleep(10);}TerminateThread(setHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);closesocket(scCon);*printf("\nlink[%s] closed!\n",s_adr);}closesocket(scSr);return ;}DWORD WINAPI gotsListen(LPVOID lpParam){)char gots[1000];while(linked){// EnterCriticalSection(&g_cs);if(recv(*(SOCKET *)lpParam,gots,1000,0)==-1)break;// LeaveCriticalSection(&g_cs);puta(gots,1);}@linked=false;return 0;}DWORD WINAPI setsListen(LPVOID lpParam){while(linked){geta(bufer);// EnterCriticalSection(&g_cs);?send(*(SOCKET *)lpParam,bufer,strlen(bufer)+1,0);// LeaveCriticalSection(&g_cs);puta(bufer,0);}ExitThread(NULL);return 0;}@void puta(char *s,int sta){int i=1;char s_tim[16];getime(s_tim);switch(sta){case 0:EnterCriticalSection(&t_cs);while(i--)>printf("\b \b");printf("[local] %s\n %s\n",s_tim,s);LeaveCriticalSection(&t_cs);break;case 1:EnterCriticalSection(&t_cs);i+=buflen;while(i--))printf("\b \b");printf("[NET] %s\n %s\n",s_tim,s);printf(">%s",bufer);LeaveCriticalSection(&t_cs);break;}};\void geta(char *s){char c;EnterCriticalSection(&t_cs);printf(">");bufer[buflen=0]='\0';LeaveCriticalSection(&t_cs);while(c=getch()){if(c>31&&c<127){¥EnterCriticalSection(&t_cs);s[buflen++]=c;s[buflen]='\0';printf("%c",c);LeaveCriticalSection(&t_cs);}else{switch(c){case 13:?EnterCriticalSection(&t_cs);while(buflen--)printf("\b \b");LeaveCriticalSection(&t_cs);return;case 8:EnterCriticalSection(&t_cs);if(buflen){…buflen--;printf("\b \b");s[buflen]='\0';}LeaveCriticalSection(&t_cs);break;}};}}3、客户端#include <>#include <>#include <>#include <>【#include ""#pragma comment(lib,"")DWORD WINAPI gotsListen(LPVOID);DWORD WINAPI setsListen(LPVOID);void geta(char *);&void puta(char*,int);void getime(char *);CRITICAL_SECTION t_cs;char bufer[1000];int buflen;—bool linked;void main(void){HANDLE gotHandle;HANDLE setHandle;char s_adr[10];WSADATA wsD;:if(WSAStartup(MAKEWORD(1,1),&wsD))return ;if!=MAKEWORD(1,1)){WSACleanup();return;}'SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);while(true){printf("Ready to Connect:");scanf("%s",s_adr);SOCKADDR_IN adrSr;=AF_INET;【=htons(6000);linked=!connect(scSr,(SOCKADDR *)&adrSr,sizeof(SOCKADDR));if(linked){printf("link[%s] created success!\n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=CreateThread(NULL,0,&gotsListen,&scSr,0,NULL);setHandle=CreateThread(NULL,0,&setsListen,&scSr,0,NULL);…while(linked){Sleep(10);}TerminateThread(setHandle,NULL);TerminateThread(gotHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);(}else{printf("Failed to connect %s,check it and try again!\n",s_adr);}closesocket(scSr);printf("\nlink[%s] be closed!\n",s_adr);}return ;}~DWORD WINAPI gotsListen(LPVOID lpParam){char gots[10000];while(linked){// puts("running");// EnterCriticalSection(&g_cs);]if(recv(*(SOCKET *)lpParam,gots,1000,0)==-1)break;// LeaveCriticalSection(&g_cs);puta(gots,1);}linked=false;ExitThread(NULL);return 0;}|DWORD WINAPI setsListen(LPVOID lpParam){while(linked){geta(bufer);// EnterCriticalSection(&g_cs);send(*(SOCKET *)lpParam,bufer,strlen(bufer)+1,0);// LeaveCriticalSection(&g_cs);puta(bufer,0);}{ExitThread(NULL);return 0;}void puta(char *s,int sta){int i=2;char s_tim[16];getime(s_tim);—switch(sta){case 0:EnterCriticalSection(&t_cs);while(i--)printf("\b \b");printf("[local] %s\n %s\n",s_tim,s);LeaveCriticalSection(&t_cs);break;)case 1:EnterCriticalSection(&t_cs);i+=buflen;while(i--)printf("\b \b");printf("[NET] %s\n %s\n",s_tim,s);printf(">%s",bufer);LeaveCriticalSection(&t_cs);*break;}};void geta(char *s){char c;EnterCriticalSection(&t_cs);printf(">");《bufer[buflen=0]='\0';LeaveCriticalSection(&t_cs);while(c=getch()){if(c>31&&c<127){EnterCriticalSection(&t_cs);s[buflen++]=c;s[buflen]='\0';printf("%c",c);—LeaveCriticalSection(&t_cs);}else{switch(c){case 13:EnterCriticalSection(&t_cs);while(buflen--)printf("\b \b");LeaveCriticalSection(&t_cs);return;case 8:EnterCriticalSection(&t_cs);if(buflen){buflen--;printf("\b \b");s[buflen]='\0';}LeaveCriticalSection(&t_cs);break;}}}}八、调试运行本实例在同一ip和不同分别做了测试,运行状况达到了预期的效果,下面是相关的几张运行截图:服务器以及客户端启动的画面建立连接之后提示信息以及命令提示符客户端向服务器发送信息下面来做一系列的测试查看程序防交叉输出的功能:1、连接之后服务端在写一些内容2、客户端发送了一条消息,服务端将消息插入,并继续等待输入端输入3、服务器继续编辑文本并发送(注意服务器在收到消息之后可以修改输入的内容)断开连接九、心得体会经过了两个星期的学习,这次课程设计基本圆满完成了,这次课程设计我收获了很多。