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的快速发展和普及,网络已经遍布世界各个角落。
计算机网络课程设计报告网络连天程序的设计与实现)姓名:李坚学号: 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、服务器继续编辑文本并发送(注意服务器在收到消息之后可以修改输入的内容)断开连接九、心得体会经过了两个星期的学习,这次课程设计基本圆满完成了,这次课程设计我收获了很多。