实验七 网络编程
1.实验目的
(1)掌握Socket通信。
(2)掌握UDP通信
2.实验内容
实验题1 利用Socket类和ServerSocket类编写一个C/S程序,实现C/S通信。
客户端向服务器端发送Time命令,服务器端接受到该字符串后将服务器端当前时间返回给客户端;客户端向服务器端发送Exit命令,服务器端向客户端返回“Bye”后退出。
[基本要求] 编写完整程序。
服务器端:
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MessageServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(3000);
Socket client = server.accept();//启动倾听,等待客户端
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));//输入流对象
PrintWriter out = new PrintWriter(client.getOutputStream());//输出流对象
BufferedReader userin = new BufferedReader(new InputStreamReader(System.in));//实现键盘输入
//启动接受和发送线程
new sendThread(out,userin,server).start();
new reciveThread(in).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class reciveThread extends Thread {
BufferedReader in;
// 服务器端接受线程
public reciveThread(BufferedReader in) {
this.in = in;
}
@Override
public void run() {
try {
while (true) {
String info = in.readLine();// 获取信息 if (info.equals("exit")) {
break;
}
while (info != null) {
System.out.println(info); info = in.readLine();
if (info.equals("exit")) {
System.out.println(info); break;
}
}
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class sendThread extends Thread {
PrintWriter out;
BufferedReader userin;
ServerSocket server;
public sendThread(PrintWriter out, BufferedReader userin, ServerSocket server ) { this.out = out;
this.userin = userin;
this.server = server;
}
@Override
public void run() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); String str = null;
try {
out.println(sf.format(new Date()));
out.flush();
while (true) {
str = userin.readLine();
out.println("Server:" + "\n" + str);// 服务器端从键盘输入
out.flush();
if (str.equals("Bybe")) {
break;
}
}
userin.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class clent {
public static void main(String[] args) {
try {
Socket server = new Socket(InetAddress.getLocalHost(), 3000);//创建套接字
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader userin = new BufferedReader(new InputStreamReader(System.in));
new sendThread(out,userin).start();
new reciveThread(server,in,out,userin).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class reciveThread extends Thread {
BufferedReader in;
PrintWriter out;
BufferedReader userin;
Socket client;
public reciveThread(Socket client, BufferedReader in, PrintWriter out,
BufferedReader userin) {
this.in = in;
this.client = client;
this.out = out;
this.userin = userin;
}
@Override
public void run() {
try {
while (true) {
String info = in.readLine(); if (info.equals("Bybe")) { break;
}
while (info != null) {
System.out.println(info); info = in.readLine();
if (info.equals("Bybe")) { System.out.println(info); break;
}
}
break;
}
client.close();
in.close();
out.close();
userin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package edu.cn.jp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class sendThread extends Thread {
PrintWriter out;
BufferedReader userin;
public sendThread(PrintWriter out, BufferedReader userin) {
this.out = out;
this.userin = userin;
}
@Override
public void run() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); String str = null;
try {
out.println(sf.format(new Date()));
out.flush();
while (true) {
str = userin.readLine();
out.println("client: " + "\n" + str);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
实验题2 编写一数据报通信程序,实现简单的聊天功能。
图3.9 聊天程序界面
[基本要求] 两人一组编写完整程序。
“聊天内容”和“输入文本”分别为当前聊天的历史信息和当前要传送出去的聊天文本。“确定”、“清空”、“退出”三个按钮分别实现发送当前聊天文本、清空当前聊天文本和退出系统的功能。
package cn.edu.udp.jp;
import
public classextends JFrame {
private JPanel contentPane;
private JTextField textField;
private static JTextArea textArea;
public static void receive() throws Exception {
DatagramSocket ds = new DatagramSocket(7000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
if(!InetAddress.getLocalHost().getHostAddress().equals(ip)){
textArea.append("接收UDP包:\n" + new String(buf, 0, dp.getLength()) + "\n"); } ds.close(); } public void send(String sendStr) throws Exception { InetAddress address = InetAddress.getByName("127.0.0.1"); byte[] buf = sendStr.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, address, 7000); DatagramSocket ds = new DatagramSocket(); ds.send(dp); ds.close(); } static void recieve() {//接收UDP包 new Thread(new Runnable() { @Override public void run() { try { receive();
} } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }).start(); /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Gui_Udp frame = new Gui_Udp(); recieve(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public Gui_Udp() { setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JButton btnSureButton = new JButton("\u786E\u5B9A"); btnSureButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (textField.getText() != " ") { textArea.append("发送UDP包:\n " + textField.getText() + "\n");
try {
send(textField.getText());//发送UDP包
textField.setText(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
btnSureButton.setBounds(323, 34, 83, 27);
contentPane.add(btnSureButton);
JButton btnClearButton = new JButton("\u6E05\u7A7A");
btnClearButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText("");
textArea.setText("");
}
});
btnClearButton.setBounds(323, 100, 83, 27);
contentPane.add(btnClearButton);
JButton btnOutButton = new JButton("\u9000\u51FA");
btnOutButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.exit(1);
}
});
btnOutButton.setBounds(323, 177, 83, 27);
contentPane.add(btnOutButton);
textField = new JTextField();
textField.setBounds(38, 178, 222, 27);
contentPane.add(textField);
textField.setColumns(10);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_N
EVER);
scrollPane.setBounds(38, 13, 222, 140); contentPane.add(scrollPane);
textArea = new JTextArea();
textArea.setEditable(false);
scrollPane.setViewportView(textArea); textArea.setWrapStyleWord(true); }
}
实习总结:
这一块的实习真的好难啊。。