socket网络编程大作业

2024-05-23

socket网络编程大作业(精选4篇)

篇1:socket网络编程大作业

实验心得体会

在本次实验中,我通过对网络课上所学知识的应用,学到了很多实践中的知识。并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解各种协议的工作以及在网络编程中应该注意的一系列问题。

我们的第一个实验是对ARP、ICMP、FTP和HTTP协议的分析和验证。在利用软件Etherpeek抓取在主机通信中的报文,得到了很多的关于这些协议的具体参数。在课程学习过程中,书本和老师给我的感觉就是太枯燥,通过课本的学习根本没有办法理解各种协议的工作细节。有很多的细微之处是想不通的。但是,在本次实验中,我就通过各种报文的分析,看到了网络中不同层次协议之间的协做过程。对应不同层之间就是通过协议来使用,我对整个网路的大体架构有了一个统筹的了解,虽然对很多的更深入的知识不是很了解,但是比我在课上学的东西要更有趣,而且容易学习,更能够我学习的兴趣。

第二个实验是Socket编程实验。在编写网络程序之前,我对网路通信可以说一无所知,根本不知道那些网路上的程序是怎么通过网路进行通信的。在本次实验中,终于揭开了他们神秘的面纱。当然在实验中出现了很多的插曲,我是在Linux环境下编写的程序,很多技术方面的问题都无法解决。查阅书籍和网上咨询才弄懂了他们的来龙去脉,最终是将我的程序编写完了。开始接触网路编程时,那是一头雾水,根本不知从何下手。在看了辅导教员给我们程序之后才有了很多的起色,才能够自己编写程序。在网络编程中,我最深的体会就是对具体的内部细节不熟悉,导致在调试的过程中感觉到很无力。在很多函数的作用下,经常就是一团乱麻。之后,我每次编写之前就是将用到的函数的用法温习一下,最后还是能够解决很多的问题的。

本次试验是我们学习网路的第一次。以前的课程从来没有接触到网路方面的知识。这次的新知识对我们的挑战还算不是太大,通过我们的努力,所有的困难时被克服掉了。其实,实验应该是我们的重点,在以后的工作中要的就是我们的实际的动手能力,如果我们在学习期间就是只学了书本上的知识,那样对理论的了解是不够深刻的,只有通过实验才能激发我们的学习兴趣。总之,我觉得实验才是检验理论的唯一标准。

篇2:socket网络编程大作业

----通过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、预期结果

通过运用套接字,实现服务器端与客户端的数据传送。

5、关键字

流式套接字;TCP/IP协议;服务器/客户端

正 文

1、理论基础

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字的接口,区分不同应用程序进程间的网络通信和连接。网络化的应用程序在开始任何通讯之前都必需要创建套接字。

套接字可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入套接字中,该套接字将这段信息发送给另外一个套接字中,使这段信息能传送到其他程序中。

套接字,是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP协议。

2、设计方法及思路

客户端与服务器建立连接,连接是通过申请的套接字实现的,客户打开一个套接字并把它约束在一个端口上如果成功就相当于建立一个虚拟文件以后就可以在虚拟文件上写数据并通过网络向外传送,完成连接后就可以通信了。客户机向服务器发送请求,打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求操作。服务器在处理完客户的请求之后,要向客户机发送响应消息。客户通过关闭套接字来结束TCP/IP对话。

当使用TCP/IP协议发送客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便为他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。bind()函数实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。

对于客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求接下来就可以与服务器通信了

3、编程方法

TCP/IP流式套接字的编程步骤(客户端程序)及流程 1)加载套接字库

2)创建套接字(socket)

3)向服务器发出连接请求(connect)

4)和服务器端进行通信 5)关闭套接字 6)流程

4、主要内容及对其分析

客户端源程序

using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace Socket { public partial class Server : Form { public Server(){ InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls = false;}

private void ErrShow(string str, Exception ex)4

{ SetShow(“------错误-------rn”);SetShow(ex.Message + “rn”);SetShow(“-----------------rn”);}

private void SetShow(string str){ txtShow.AppendText(str+“rn”);} #region 服务端部分 //负责监听端口

System.Net.Sockets.Socket wellcome = null;//负责和客户端通信

System.Net.Sockets.Socket connect = null;//负责监听线程

Thread listenThread = null;

private void btnListen_Click(object sender, EventArgs e){ //创建 try { IPAddress ipadd = IPAddress.Parse(txtIp.Text.Trim());//创建端口

IPEndPoint ipend = new IPEndPoint(ipadd, int.Parse(txtPort.Text.Trim()));//监听套接字(寻址协议流方式、Tcp协议 wellcome = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);wellcome.Bind(ipend);wellcome.Listen(10);//允许监听的最大数量 SetShow(“开始监听了-…-”);listenThread = new Thread(Listing){ IsBackground = true };listenThread.Start();

} catch(Exception ex){ ErrShow(“", ex);5 }

}

///

/// 监听 /// private void Listing(){ while(true){ try { connect = wellcome.Accept();SetShow(”已监听到了!“);Thread recive = new Thread(ReciveMsg){ IsBackground = true };recive.Start();} catch(Exception ex){ ErrShow(”“, ex);} } } /// /// 服务端监听用户接收数据 /// private void ReciveMsg(){ while(true){ try { byte[] bytes = new byte[1024 * 1024 * 2];int length = connect.Receive(bytes);if(length > 0){ SetShow(Encoding.UTF8.GetString(bytes, 0, length));} } catch(Exception){ 6 } } } private void btnServer_Click(object sender, EventArgs e){ byte[] datas = Encoding.UTF8.GetBytes(txtServerTxt.Text.Trim());connect.Send(datas, 0, datas.Length, SocketFlags.None);} #endregion

5、结果

运行页面

监听页面

监听错误报告

6、不足之处

我们的这次课程设计程序编写运用C#语言。虽然满足设计的基本要求要求,但由于对TCP的概念相对于模糊,导致缺少对端口号的判断,使得任意的端口号都可以进行数据传送,而且没有考虑到一些端口号的特殊性,使得程序整体运行不完美。

因此考虑到这些不足,以下是对程序的补充。

改进程序设计:

1)判断客户输入的端口号是否是合理的:

try { Int16 x = Convert.ToInt16(this.txtClientTxt.Text.Trim());} catch { MessageBox.Show(”请输入大于0的整数!“,”提示“,MessageBoxButtons.OK);textBox1.Focus();return;}

if(Convert.ToInt16(this.txtClientTxt.Text.Trim())<= 0){ MessageBox.Show(”请输入大于0的整数!“, ”提示“, MessageBoxButtons.OK);textBox1.Focus();return;} 2)检查TCP端口是否被占用

Process p = new Process();//提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。

//Process.StartInfo 属性,获取或设置要传递给 Process 的 Start 方法的属性。p.StartInfo = new ProcessStartInfo(”netstat“, ”-a“);//指定启动进程时使用的一组值。p.StartInfo.CreateNoWindow = true;//获取或设置指示是否在新窗口中启动该进程的值。//如果UseShellExecute属性是true或UserName和Password属性不是null、CreateNoWindow属性值将被忽略,并创建一个新窗口。

p.StartInfo.UseShellExecute = false;//获取或设置一个值,该值指示是否使用操作系统 shell 启动进程。

p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//获取或设置启动进程时使用的窗口状态。

p.StartInfo.RedirectStandardOutput = true;//获取或设置一个值,该值指示是否将应用程序的输出写入 Process.StandardOutput 流中。p.Start();string result = p.StandardOutput.ReadToEnd().ToLower();//最后都转换成小写字母 //Environment.MachineName获取此本地计算机的 NetBIOS 名称。

if(result.IndexOf(”tcp “ + Environment.MachineName.ToLower()+ ”:“ + textBox1.Text)>= 0){ MessageBox.Show(”TCP“ + textBox1.Text + ”端口被占用“,”提示

“,MessageBoxButtons.OK,MessageBoxIcon.Information);} else { MessageBox.Show(”TCP“ + textBox1.Text + ”端口没有被占用“, ”提示", 9 MessageBoxButtons.OK.MessageBoxIcon.Information);} 结 论

通过这次的网络课程设计收获颇多,在对与原有的基础上再一次的学习TCP知识。我们组这次做的课题的目的就是通过套接字在客户端和服务器之间建立连接,这个连接是以TCP协议传输。在建立连接之后实现客户端与服务器之间的通信,从而设计相关函数的调用和对套接字的应用。: 客户连接(Client connections)由客户启动,并将本地客户套接字与远程服务器套接字相连.客户套接字必须说明它们想连接的服务器.需要提供服务器的主机名或IP地址及其端口号.2 : 监听连接(Listening Connections)是等待客户的被动服务器套接字连接.一旦客户发出了新的请求,服务器就会为该特殊连接生成新的套接字,然后返回监听状态.监听服务器套接字必须说明代表其提供服务的端口吗(事实上,客户正是通过该端口进行连接的).3 : 服务器连接是由服务器激活的连接,负责接受来自客户的请求.这些不同的连接种类只对建立客户与服务器之间的连接具有重要性.一旦连接建立完毕.连接的双方都可以自由发出请求并彼此发送数据.这里面涉及什么是套接字,什么是流式套接字,为什么用流式套接字等问题。用套接字中的相关函数来完成通信过程,它的存在是为了区别不同应用程序进程间的网络通信和连接。流套接字用于提供面向连接、可靠的数据传输服务,又因为该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,所以用了流式套接字。

致 谢

真诚感谢老师在我们课程设计阶段给予我们的指导与帮助以及专业课的教授,在老师的指导下使我对网络专业知识有了更深的认识,并且您严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我,这些使我受益匪浅,并将成为我终身献身科学和献身事业的动力。在此向您致以诚挚的谢意与敬意。

参考文献

《计算机网络课程设计》吴功宜、胡晓英、张仁、何云、王宁编著 机械工业出版社

篇3:Java网络编程-Socket

Socket可以说是对TCP/IP协议的封装和应用 ( 程序员层面上) , 但是它也适用于其它协议如UDP协议, Socket是一种应用接口, TCP/IP是网络传输协议, 虽然接口相同, 但是不同的协议会有不同的服务性质。 创建Socket连接时, 可以指定使用的传输层协议, Socket可以支持不同的传输层协议 (TCP或UDP ) , 当使用TCP协议进行连接时, 该Socket连接就是一个TCP连接。 因此也可以说Socket跟TCP/IP协议没有必然的联系。 Socket的出现只是可以更方便的使用TCP/IP协议栈而已。 Java语言中Socket通信机制采用了IO流操作模型。 首先通信的双方, 客户端和服务器需要建立Socket连接; 之后双方都有各自的Socket对象。 该Socket对象包含两个流: 一个是输入流Input Stream, 其作用是接收数据; 另一个是输出流Output Stream, 作用是向外发送数据。 Java为TCP协议提供了两个类: Socket类和Server Socket类。 一个Socket实例代表了TCP连接的一端。 一个TCP连接 (TCP connection) 是一条抽象的双向信道, 两端分别由IP地址和端口号确定。 在开始通信之前, 要建立一个TCP连接, 这需要先由客户端TCP向服务器端TCP发送连接请求。 Server Socket实例则监听TCP连接请求, 并为每个请求创建新的Socket实例。 也就是说, 服务器端要同时处理Server Socket实例和Socket实例, 而客户端只需要使用Socket实例。

HTTP是基于Socket通信的子协议, Socket收发信息自由, 协议都可由使用者定义。 HTTP在Socket基础上做了协议规范, 通信只能按照特定的格式去做, 用户可在HTTP上做自己的子协议, 如网页浏览, webservice, soap等。 构造一个ServerSocket对象, 并绑定到所指定的端口port上面。 Server Socket对象一旦建立, 就可以完成其监听端口和等待连接的功能。在开发中用到Socket感觉是很高大上的, 在Java中有关Socket相关的类都位于java.net包下, sun.* 这个包也包含了很多的网络编程相关的类, 但是不建议使用这个包下面的API, 因为这个包可能会改变, 另外这个包不能保证在所有的平台都有包含。

篇4:socket网络编程大作业

关键词:java;多线程;socket编程

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30796-01

The Java Multi-threading Mechanism Weaves the Application in the Distance in the Socket

XU Xiao-long

(Dept.of Computer Science,Qufu Normal University,Rizhao 276826,China)

Abstract:This paper discusses the theory and usage of Java multithreading, especially how to use multithreading in socket programming, so that the server can response the requests of many clients at the same time.

Key words:java; multithreading; socket programming

随着分布式系统的兴起,并发多任务技术越来越重要。在现有的基于多线程的操作系统上开发并发多任务程序已成为程序设计的热点。Java是开发网络应用程序的热门技术之一,本文首先分析了Java多线程机制的特性,然后以Windows XP为平台,以JDK6.0为开发环境分析了Java的多线程机制在Socket编程中的应用。

1 线程的特点

以往所开发的程序多数是单线程的,即一个程序只有一条从头至尾的执行路线。然而现实世界的很多过程却需要多条途径同时运行,例如服务器需要同时处理多个客户的请求,多媒体程序需要对多种媒体并发控制等。

线程是指进程中单一顺序的控制流,又称为轻量级进程。每个进程可以启动几个线程,线程是最小的运行单位。操作系统的多任务特性使得线程之间独立运行,但是它们彼此共享存储空间,可能会同时操作同一内存地址。

2 Java对多线程的支持

2.1概述

Java是通过多线程机制来支持多任务和并行处理的,多线程编程是Java语言最重要的特征之一。多线程是指同时存在几个执行体,按几条不同的执行路线共同工作的情况。Java的多线程机制使得编程人员可以很方便地开发出具有多线程功能,能同时处理多个任务的功能强大的应用程序。

Java对多线程的支持表现为两个方面:一是它本身就是一个多线程体系。Java是基于多线程来执行任务的。例如,有若干个系统线程用于必要的“垃圾”回收,自动作存储器管理工作及其它系统维护工作。另外,Java内置了多线程控制机制,从而大大简化了多线程应用程序的开发。Thread类封装了所有有关线程的控制,负责线程的启动、运行、休眠、挂起、恢复、退出和终止等一般性的逻辑控制操作,并可检查线程的状态。除此之外,Thread类也实现了对线程行为的优先级的控制。由于CPU一次只能执行一个线程中的指令,因此对多线程体系而言,必须通过优先级决定线程之间的切换。

2.2线程的创建

Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java提供了Thread类来创建线程,线程就是Thread类或其子类的对象。

Thread thread1=new Thread();

thread1.start();

这样就创建了一个线程,并启动了该线程。启动线程就是启动线程的run()方法,而Thread类中的run()方法没有任何操作语句,所以要使线程实现预定功能,必须定义自己的run()方法。Java中通常有两种方式定义run()方法:

一是通过定义Thread类的子类,在该子类中重写run()方法。Thread子类的实例就是一个线程,启动线程就启动了子类中重写的run()方法。

二是通过实现Runnable接口,在该接口中定义run()方法。

线程被创建后处于待命状态,启动线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。

2.3线程的优先级

对于多线程程序,每个线程的重要程度不尽相同,如多个线程在等待处理机时,往往需要优先级高的线程优先抢占到CPU得以执行;又如多个线程交替执行时,希望优先级高的线程得到CPU的时间长一些;这样,高优先级的线程处理的任务效率就高一些。

Java中线程的优先级从低到高以整数1~10表示,共分为10级,设置优先级是通过调用线程对象的setPriority()方法。

2.4线程的同步

线程的异步执行是指线程抢占CPU,不关心其它线程的状态或行为。但是在访问一些共享资源时,这种无序访问会导致无法得到正确的结果。因此当两个或多个线程需要访问同一资源时,它们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,这种方式称为同步。

Java在同步机制中提供了语言级的支持,可以通过对关键代码段使用synchronized关键字修饰来实现针对该代码段的同步操作。

2.5线程间的相互联系

可以利用wait()、notify()及notifyAll()方法发送消息实现线程间的相互联系,在同一时刻只能有一个线程访对象中的同步方法,其它线程被阻塞。通常可以用notify()或notifyAll()方法唤醒其它一个或所有线程。而使用wait()方法来使该线程处于阻塞状态,等待其它的线程用notify()唤醒。

3 多线程在Socket编程中的应用

3.1服务器端的多线程

网上数据交互的主要特点是发生的随机性,即消息的到达不存在任何预示或规律,协作双方无法预知信息到达的时间,所以要防止信息丢失。因此,需要在服务器程序中设置一个循环语句,反复检测输入流中有没有来自客户的数据。以一个简单的例子说

(上接第796页)

明这个问题:客户通过输出流将一个字符串传给服务器,服务器收到后将字符串的所有字母转换为大写,然后通过输出流回送给客户。程序如下:

public static void main(String[] args) throws Exception{

ServerSocket ss = new ServerSocket(PORT);

Socket skt = ss.accept();

DataInputStream dis = new DataInputStream(skt.getInputSream());

DataOutputStream dos = new DataOutputStream(skt.getOutputStream());

while (true) {

String s = dis.readUTF();

if (s!=null)dos.writeUTF(s.toUpperCase()); } }

该程序的一个明显缺陷是只能接收来自一个客户的数据,因为程序会停留在while语句处反复检测,这是服务器程序所不能容忍的。为了能接收来自多个客户的数据,必须采用多线程的方法。

每与一个客户建立连接后,就启动一个线程,让该线程检测输入流中有无数据,便可实现服务器同时响应多个客户的请求。方法如下:

class ServerThread extends Thread{

Socket skt = null;

DataInputStream dis = null;

DataOutputStream dos = null;

ServerThread(Socket skt1){

skt = skt1;

try{

dis = new DataInputStream(skt.getInputStream());

dos = new DataOutputStream(skt.getOutputStream());

}catch(Exception e){} }

public void run(){

while (true){

String s = dis.readUTF();

if (s!=null)dos.writeUTF(s.toUpperCase()); }}}

这样主方法就可以只负责接收客户请求,将每个请求的Socket对象作为参数传递给ServerThread的构造方法,然后将该ServerThread对象启动,便会有一个线程专门负责监听该客户的请求。主方法为:

public static void main(String[] args) throws Exception{

ServerSocket ss = new ServerSocket(PORT);

while (true){

Socket skt = ss.accept();

if (skt!=null)new ServerThread(skt).start();}}

3.2客户端的多线程

客户如果要监听服务器回送的信息,为了防止信息的遗漏,同样需要使用循环语句反复监测输入流:

while (true){

String s =-dis.readUTF();

if (s!=null) System.out.println(s);}

在这种情况下,主程序便会反复执行循环体,无法进行其它工作。如果让一个线程专门负责监听,那么该线程启动后,主程序便可解放出来处理其它事情。线程的写法可以象服务器端一样,写一个Thread的子类,也可以实现Runnable接口。

将多线程应用到Socket程序中后,便实现了客户与服务器的合理通信,既不至于遗漏信息,也不会因为监听而影响程序的其它功能。

4 结束语

本文讨论了Java的多线程机制及其使用,研究了将多线程应用于Socket程序设计的基本模型,在此模型的基础上可以方便的演化出更为复杂的程序,如聊天、远程计算等。本文对多线程及Socket编程的初学者有一定参考价值,也是研究多线程协作、即时响应等问题的基础。

参考文献:

[1]胡雯,赵海廷.JAVA多线程同步问题研究[J].软件导刊,2007,1.

[2]姜景根,李祥.基于Java的多线程并发服务器的设计与应用[J].电脑与信息技术,2007;15(1).

[3]Bruce Eckel.Think in Java[M].北京:机械工业出版社,2002.

上一篇:纪念南京大屠杀宣传稿下一篇:名人故事:“计算机之父”托马斯.沃森