网络通信程序设计课程报告

更新时间:2024-05-20 04:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

网络通信程序设计 课程论文 班级:08网络(1)班 姓名: 王捷 学号:081402124 指导老师: 肖东 23 目录

1、 引言 .............................................................................................. 2、 面向socket编程 ........................................................................

2.1.socket设计要求 ............................................................................................................................. 2.2.程序修改的功能 .............................................................................................................................. 2.3.程序代码: ...................................................................................................................................... 2.4.运行结果: ......................................................................................................................................

3、 基于UDP的网络编程 ..................................................................

3.1.UDP设计要求 ................................................................................................................................... 3.2.程序修改的功能 .............................................................................................................................. 3.3.程序修改以及代码: ...................................................................................................................... 3.4.运行结果: ......................................................................................................................................

4、 基于协议的网络编程 ..................................................................

4.1.网络协议设计要求 .......................................................................................................................... 4.2.程序修改的功能 .............................................................................................................................. 4..3. 程序代码…………………………………………………………………………………………. 4.4. 运行结果………………………………………………………………………………………….

5、 组播编程 ......................................................................................

5.1.实验要求 .......................................................................................................................................... 5.2.程序修改的功能 .............................................................................................................................. 5.3.程序修改以及代码: ...................................................................................................................... 5.4.运行结果: ......................................................................................................................................

6、 心得体会 ......................................................................................

第 1 页 共 23 页

1

1、 引言

网络编程简单的理解就是两台计算机相互通讯数据,通过使用套接字来达到进程间通

信目的编程就是网络编程。 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理。

网络通讯程序设计这门课程采用Java语言进行程序编写,Java突出的优点是通过预定义的库可以实现很强的功能,而不需要程序员做很多的事情。对于Java而言,这些Socket的Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了, Socket、UDP、组播、协议就是网络编程技术的一部分。这门课程的课程设计就从socket、UDP、组播、协议几个方面分别进行编写一些简单的例子。

2、 面向socket编程 2.1.socket设计要求

①建立两个独立的面向SOCKET编程的JAVA工程,用于服务器和客户端系统; ②建立SOCKET的JAVA类,并能正确运行且能实现SOCKET通信; ③对JAVA类的功能进行拓广,使SOCKET用于某一具体的应用。

2.2.程序修改的功能

① 实现界面图形化:客户端实现界面图形化,服务端则没有界面图形化。

② 实现客户端能够即时聊天功能:当打开server端后,运行两个客户端,便可进行即时聊天,聊天记录没有保存,没有显示IP,只能进行简单的聊天。每当一个客户端连接上时,服务端会显示“a client connected!”,当每一个客户端退出时,便会显示“client closed!”

2.3.程序关键代码:

2.3.1服务端—ChatServer的代码: import java.io.*;

import java.net.*; import java.util.*;

public class ChatServer {

boolean started = false; ServerSocket ss = null;

List clients = new ArrayList(); public static void main(String[] args) { }

public void start() {

try {

ss = new ServerSocket(8888);

第 2 页 共 23 页

2

new ChatServer().start();

started = true;

} catch (BindException e) {

System.out.println(\端口使用中....\);

System.out.println(\请关掉相关程序并重新运行服务器!\); System.exit(0); } catch (IOException e) {

e.printStackTrace();

}

try { while(started) { Socket s = ss.accept(); Client c = new Client(s); out.println(\);

new Thread(c).start(); clients.add(c);

}

} catch (IOException e) { e.printStackTrace(); } finally {

try { ss.close();

} catch (IOException e) {

e.printStackTrace(); }

}

} class Client implements Runnable {

private Socket s;

private DataInputStream dis = null; private DataOutputStream dos = null; private boolean bConnected = false; public Client(Socket s) { this.s = s; try { dis = new DataInputStream(s.getInputStream()); dos = new DataOutputStream(s.getOutputStream()); bConnected = true; } catch (IOException e) {

e.printStackTrace();

}

}

public void send(String str) {

第 3 页 共 23 页

3

System. try { dos.writeUTF(str); } catch (IOException e) {

clients.remove(this); System.out.println(\对方退出了!我从List里面去掉了!\); }

}

public void run() { try { while(bConnected) { String str = dis.readUTF();

System.out.println(str);

for(int i=0; i

}

}

} catch (EOFException e) { System.out.println(\); } catch (IOException e) { e.printStackTrace(); } finally {

try { if(dis != null) dis.close(); if(dos != null) dos.close(); if(s != null) { s.close();

}

} catch (IOException e1) { e1.printStackTrace();

}

}

}

}

}

2.3.2客户端—ChatClient代码: import java.awt.*;

import java.awt.event.*; import java.io.*; import java.net.*;

第 4 页 共 23 页

4

public class ChatClient extends Frame { Socket s = null;

DataOutputStream dos = null; DataInputStream dis = null;

private boolean bConnected = false; TextField tfTxt = new TextField(); TextArea taContent = new TextArea();

Thread tRecv = new Thread(new RecvThread()); public static void main(String[] args) { new ChatClient().launchFrame();

}

public void launchFrame() { setLocation(400, 300); this.setSize(300, 300);

add(tfTxt, BorderLayout.SOUTH); add(taContent, BorderLayout.NORTH); pack();

this.addWindowListener(new WindowAdapter() { @Override

public void windowClosing(WindowEvent arg0) { disconnect(); System.exit(0);

}

});

tfTxt.addActionListener(new TFListener()); setVisible(true); connect(); tRecv.start();

}

public void connect() { try { s = new Socket(\, 8888);

dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); System.out.println(\);

bConnected = true; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) {

e.printStackTrace();

第 5 页 共 23 页

5

}

}

public void disconnect() { try { dos.close(); dis.close(); s.close();

} catch (IOException e) {

e.printStackTrace();

}

}

private class TFListener implements ActionListener { public void actionPerformed(ActionEvent e) { String str = tfTxt.getText().trim(); tfTxt.setText(\); try { dos.writeUTF(str); dos.flush();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

private class RecvThread implements Runnable { public void run() { try { while(bConnected) { String str = dis.readUTF();

taContent.setText(taContent.getText() + str + '\\n');

}

} catch (SocketException e) {

System.out.println(\退出了,bye!\); } catch (EOFException e) {

System.out.println(\退出了,bye - bye!\); } catch (IOException e) { e.printStackTrace();

}

}

第 6 页 共 23 页 6

}

}

2.4.运行结果:

①运行服务端,接着运行客户端,多个客户端互发信息,运行显示如下:

图2-1 启动程序运行效果

②关闭客户端后关闭服务端,运行结果如下:

图2-2 关闭程序后显示结果

3、 基于UDP的网络编程 3.1.UDP设计要求

①建立两个独立的基于UDP编程的JAVA工程,用于服务器和客户端系统; ②建立UDP的JAVA类,并能正确运行且能实现数据报通信;

③对JAVA类的功能进行拓广,使基于UDP编程用于某一具体的应用。

第 7 页 共 23 页

7

3.2.程序修改的功能

①实现界面图形化

②能手动输入对方IP,跟对方建立聊天

③实现客户端实时聊天功能,能够互发信息,聊天消息能显示对方IP地址和对方名字

3.3.程序修改以及代码:

UDP_A:

import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class A extends JFrame implements Runnable, ActionListener {

JTextField outmessage = new JTextField(30); JTextField name = new JTextField(12);

JTextArea inmessage = new JTextArea(12, 20); JButton b = new JButton(\发送\); JTextField add = new JTextField(30);

A() {

super(\基于UDP的聊天工具:A \); setBounds(500, 100, 400, 400); setVisible(true);

Box a = Box.createVerticalBox(); Box c = Box.createHorizontalBox(); Box p = Box.createHorizontalBox(); Box h = Box.createHorizontalBox(); b.addActionListener(this);

p.add(new JLabel(\你的名字:\)); p.add(name); p.add(outmessage); p.add(b);

c.add(new JLabel(\对方的IP:\)); c.add(add); a.add(p); a.add(c); a.add(h);

Container con = getContentPane();

con.add(new JScrollPane(inmessage), BorderLayout.CENTER); con.add(a, BorderLayout.SOUTH); Thread thread = new Thread(this);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); validate();

第 8 页 共 23 页

8

thread.start(); }

public void actionPerformed(ActionEvent event) { if (event.getSource() == b) { String s;

s = name.getText() + \ + outmessage.getText();

byte[] b = s.trim().getBytes(); try {

InetAddress address =

InetAddress.getByName(add.getText().trim());

DatagramPacket data = new DatagramPacket(b, b.length, address, 8989);

DatagramSocket mail = new DatagramSocket(); mail.send(data);

inmessage.append(\ + outmessage.getText()+'\\n'); outmessage.setText(null); outmessage.requestFocus(); } catch (Exception e) { } } }

public void run() {

DatagramPacket pack = null; DatagramSocket mail = null; byte[] b = new byte[5689]; try {

pack = new DatagramPacket(b, b.length); mail = new DatagramSocket(8787); } catch (Exception e) { }

while (true) { try {

mail.receive(pack);

String message = new String(pack.getData(), 0, pack.getLength()); inmessage.append(message+'\\n'); } catch (Exception e) { } } }

public static void main(String[] args) { A a = new A(); } } UDP_B:

第 9 页 共 23 页

9

import java.awt.*; import java.net.*; import java.awt.event.*; import javax.swing.*;

public class B extends JFrame implements Runnable, ActionListener {

JTextField outmessage = new JTextField(30); JTextField name = new JTextField(12);

JTextArea inmessage = new JTextArea(12, 20); JButton b = new JButton(\发送\

JTextField add = new JTextField(30);

B() {

super(\基于UDP的聊天工具:B \ setBounds(200, 100, 400, 400); setVisible(true);

Box a = Box.createVerticalBox(); Box c = Box.createHorizontalBox(); Box p = Box.createHorizontalBox(); Box q = Box.createHorizontalBox(); b.addActionListener(this);

p.add(new JLabel(\你的名字\ p.add(name); p.add(outmessage); p.add(b);

c.add(new JLabel(\对方的IP:\ c.add(add);

// q.add(l); a.add(p); a.add(c); a.add(q);

Container con = getContentPane();

con.add(new JScrollPane(inmessage), BorderLayout.CENTER); con.add(a, BorderLayout.SOUTH); Thread thread = new Thread(this);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); validate(); thread.start(); }

第 10 页 共 23 页

10

public void actionPerformed(ActionEvent event) { if (event.getSource() == b) { String s;

s = name.getText() + \

byte[] b = s.trim().getBytes(); try {

InetAddress address =

InetAddress.getByName(add.getText().trim());

DatagramPacket data = new DatagramPacket(b, b.length, address, 8787);

DatagramSocket mail = new DatagramSocket(); mail.send(data);

inmessage.append('\\n'+\ outmessage.setText(null); outmessage.requestFocus();

} catch (Exception e) { } }

// else if (event.getSource() == l) { // F u = new F(); // } }

public void run() {

DatagramPacket pack = null; DatagramSocket mail = null; byte[] b = new byte[5689]; try {

pack = new DatagramPacket(b, b.length); mail = new DatagramSocket(8989); } catch (Exception e) { }

while (true) { try {

mail.receive(pack);

String message = new String(pack.getData(), 0, pack.getLength()); //inmessage.append(\ inmessage.append('\\n'+message);

} catch (Exception e) { } } }

第 11 页 共 23 页

11

public static void main(String[] args) { B b = new B(); } }

3.4.运行结果:

4、 基于协议的网络编程 4.1.网络协议设计要求

①建立一个的基于协议编程的JAVA工程;

②建立协议编程的JAVA类,并能正确运行且能实现协议通信;

③对JAVA类的功能进行拓广,使基于协议编程用于某一具体的应用。

4.2.程序修改的功能

①修改协议。

4.3.程序修改以及代码:

package Protocol;

import java.io.*; import java.net.*;

public class ClientMainTest {

public static void main(String[] args) throws IOException { Socket kkSocket = null; PrintWriter out = null; BufferedReader in = null;

第 12 页 共 23 页

12

try {

kkSocket = new Socket(\

out = new PrintWriter(kkSocket.getOutputStream(), true);

in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); }

catch (UnknownHostException e) {

System.err.println(\ System.exit(1); }

catch (IOException e) {

System.err.println(\ System.exit(1); }

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String fromServer; String fromUser;

while ( (fromServer = in.readLine()) != null) { System.out.println(\ if (fromServer.equals(\ break; }

fromUser = stdIn.readLine(); if (fromUser != null) {

System.out.println(\ out.println(fromUser); } }

out.close(); in.close(); stdIn.close(); kkSocket.close(); } }

package Protocol;

import java.io.*; import java.net.*;

public class MultiServerTest {

public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try {

serverSocket = new ServerSocket(5252); }

第 13 页 共 23 页

13

catch (IOException e) {

System.err.println(\ System.exit( -1); }

while (listening) {

new MultiServerThreadTest(serverSocket.accept()).start(); }

serverSocket.close(); } }

package Protocol;

import java.io.*; import java.net.*;

public class MultiServerThreadTest extends Thread { private Socket socket = null;

public MultiServerThreadTest(Socket socket) { super(\ this.socket = socket; }

public void run() { try {

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); String inputLine, outputLine;

ServerProtocolTest kkp = new ServerProtocolTest(); outputLine = kkp.processInput(null); out.println(outputLine);

while ( (inputLine = in.readLine()) != null) { outputLine = kkp.processInput(inputLine); out.println(outputLine);

if (outputLine.equals(\ break; } }

out.close(); in.close(); socket.close(); }

catch (IOException e) { e.printStackTrace(); } }

第 14 页 共 23 页

14

PrintWriter(s2.getOutputStream());//文本流输出

out.println(str);//打印字符 out.flush();//刷新该流的缓冲 } }

} catch (IOException e) {} finally{ try {

s.close();

} catch (IOException e) {} } } }

客户端代码:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException;

import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket;

import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel;

import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField;

public class Client { JTextArea jta; JTextField jtf; JPanel p;

JButton send;

BufferedReader in; PrintWriter out; JTextField name;

private void initGUI(){

JFrame f=new JFrame(\ f.setSize(400,300);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jta=new JTextArea(); jta.setEditable(false);

f.add(new JScrollPane(jta)); jtf=new JTextField(27); name =new JTextField(20);

第 20 页 共 23 页

20

p =new JPanel();

send =new JButton(\发送\ p.add(jtf); p.add(send);

f.add(name,\ f.add(p,\ f.setVisible(true);

send.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent arg0) { String text=jtf.getText(); jtf.setText(\

out.println(name.getText()+\ out.flush(); } }); }

private void initNet(){ try {

Socket s = new Socket(\创建Socket端口8008 out = new PrintWriter(s.getOutputStream());//文本流输出,利用Socket对象获得getOutputStream()

in = new BufferedReader(new InputStreamReader(s.getInputStream()));

} catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

//消息接收

private void receive(){ try {

while(true){

String str = in.readLine(); if(str==null){ return ; }

jta.append(str+\加载到JTextArea中,显示 }

} catch (IOException e) { e.printStackTrace(); } }

private Client(){ this.initGUI();

第 21 页 共 23 页

21

this.initNet(); }

public static void main(String args[]){ Client c = new Client(); c.receive(); } }

5.4.运行结果:

6、 心得体会

这个学期其实也有Java语言这么课程,于是学习网络通信编程这门课程的时候不会太过于陌生,我们主要学习了Socket、UDP、网络协议以及组播编程4个知识点,以上机做实验为主,通过学习老师给出的程序例子,再经过分析修改,变成以各个知识点为基础的具体应用。在此过程中,从认识到了解再到基本掌握,循序渐进,提高了自己对网络通信编程的写作能力。

第 22 页 共 23 页 22

本文来源:https://www.bwwdw.com/article/kii7.html

Top