Top Banner
Advanced Network Programming Ren Jiansi [email protected]
75

Advanced Network Programming

Jan 22, 2016

Download

Documents

Lilli

Advanced Network Programming. Ren Jiansi [email protected]. 2.4 套接口类( Socket 、 ServerSocket )概述 - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Advanced Network Programming

Advanced Network Programming

Ren Jiansi

[email protected]

Page 2: Advanced Network Programming

2.4 套接口类( Socket 、 ServerSocket )概述 套接口是网络协议传输层提供的接口。套接

口是进程之间通信的抽象连接点。它封装了端口、主机地址、传输层通信协议三方面内涵(见图3 )。两个网络进程采用套接口方式通信时,两进程扮演的角色不同,它们使用的套接口也不同。主动请求服务的一方叫客户 , 它使用客户建立的套接口 Socket ,通过它主动与对方连接;服务者等待接收客户服务请求,提供服务,返回结果,它使用服务者套接口 ServerSocket.

用户目前可以使用的两种套接口,即流套接口和数据报套接口。流套接口提供了双向的、有序的、无重复并且无记录边界的数据流服务。 TCP 即是一种流套接口协议;数据报套接口支持

Page 3: Advanced Network Programming

双向的数据流,但并不保证是可靠、有序、无重复的,也就是说,一个以数据报套接口接收的信息的进程有可能发现信息重复了,或者和发出的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。 UDP 是数据报套接口协议。

每一进程运行在该主机的一个对外开放的端口上。主机地址用其 IP 地址或域名地址表示(见图 3 )。一个端口与使用该端口的进程是对应的。端口常以整数编号,作为服务者可选择一个端口号,网络的客户以服务者主机和服务者选择的端口号与服务者连接。一些端口号是网络服务约定的,如 80 是 WWW 服务的缺省端口号。

Page 4: Advanced Network Programming

图 3 基于 Socket 的点对点通信

Page 5: Advanced Network Programming

A simple server (simplified code) // SimpleServer.java: a simple server programimport java.net.*;import java.io.*;public class SimpleServer { public static void main(String args[]) throws IOException { // Register service on port 1234 ServerSocket s = new ServerSocket(1234); Socket s1=s.accept(); // Wait and accept a connection // Get a communication stream associated with the socket OutputStream s1out = s1.getOutputStream(); DataOutputStream dos = new DataOutputStream (s1out); // Send a string! dos.writeUTF("Hi there"); // Close the connection dos.close(); s1out.close(); s1.close(); }}

Page 6: Advanced Network Programming

A simple client (simplified code) // SimpleClient.java: a simple client programimport java.net.*;import java.io.*;public class SimpleClient { public static void main(String args[]) throws IOException { // Open your connection to a server, at port 1234 Socket s1 = new Socket("muu.oz.au",1234); // Get an input file handle from the socket and read the inpu

t InputStream s1In = s1.getInputStream(); DataInputStream dis = new DataInputStream(s1In); String st = new String (dis.readUTF()); System.out.println(st); // When done, just close the connection and exit dis.close(); s1In.close(); s1.close(); }}

Page 7: Advanced Network Programming

1. 套接口类 (Socket)

( 1 )构造方法1 ) Socket(String host, int port) throws Unknown

HostException,IOException

构造一个流套接口(即 Socket 对象),利用TCP 协议将其连接至特定主机 host 的特定端口port 上。

2 ) Socket(String host,int port,boolean stream)

构造一个套接口,而此套接口是流套接口( 或 TCP 协议 ) 还是数据报( datagram 或 UDP协议)套接口,则是由最后一个参数 stream 决定的。通信对方由主机名 host 和端口 port 来确定。

Page 8: Advanced Network Programming

3 ) Socket(InetAddress address,int port)

构造一个流套接口,并把它连接到特定 IP 地址 address 的主机和特定端口 port 上。

4 ) Socket(InetAddress address,int port boolean stream)

构造一个套接口,此套接口是流套接口还是数据报( datagram )套接口,则是由最后一个参数 stream 决定的。通信对方由其主机 IP 地址address 和端口 port 确定。

( 2 )套接口类提供的主要方法有:1 ) InetAddress getInetAddress()

返回该套接口( Socket )所连接的 IP 地址。

Page 9: Advanced Network Programming

2 ) int getPort()

返回该套接口( Socket )所连接的端口。3 ) sychronized void close() throws IOException

关闭套接口 4)InputStream getInputStream()

throws IOExcepiton

获得与套接口绑定的数据输入流对象。5) InputStream getOutputStream()

throws IOException

获得与套接口绑定的数据输出流对象。2. 服务者套接口类( ServerSocket )

Page 10: Advanced Network Programming

( 1 )构造方法1 ) ServerSocket(int port) throws IOException

在指定的端口上构造一个服务者套接口,即构造一个 ServerSocket 实体对象。

2 ) ServerSocket(int port , int count)

构造一个服务者套接口,即构造一个 ServerSocket 实体对象,并且该对象是与指定的当地端口绑定。此外,可以对它进行监听。用户也可以通过将 port 设为 0 来将该对象与一个匿名端口相连接。

参数: count 容许等待对该 ServerSocket 对象的连接的个数。

Page 11: Advanced Network Programming

( 2 )服务者套接口类提供的主要方法:1 ) Socket accept() throws IOException

服务者等待连接,该方法将阻塞当前服务线程,直到连接到来。该方法返回一个新的套接口类对象,通过该对象,与客户套接口进行通信。

2 ) void close() throws IOException

关闭套接口。3 使用 TCP 协议的 Socket 网络编程1. 基于客户 / 服务器方式的一对一的 Socket 通信 TCP 是一种可靠的、基于连接的网络协议。

网络上的两进程采用 Socket 方式通信时,客户与服务器都必须建立各自的 Socket ,其中服务器构

Page 12: Advanced Network Programming

图 4 服务方、客户间的通信流程图

Page 13: Advanced Network Programming

建 ServerSocket 对象,并侦听来自网络的客户连接请求,另一方作为客户,通过 Socket 向网络上的服务器发送连接请求。图 4 描述基于连接的服务者、客户程序流程图。

图 5 是服务方类 TcpServer 不完全规范的 UML 模型简图。它描述了类 TcpServer 继承了 Object 类(可默认),以及它依赖的类,如: ServerSocket 、 Socket 、 DataInputStream 、 InputStream 、 IOException 、 OutputStream 、 PrintStream 等,其中主要的是 java.net 包的 Socket 、 ServerSocket 类。

Page 14: Advanced Network Programming

图 5 服务方 UML 模型简图

Page 15: Advanced Network Programming

例 7 利用 Socket 实现服务方和客户一对一的通信。

( 1 )服务方源程序package TcpServer;

import java.io.*;

import java.net.*;

public class TcpServer

{

static public void main(String args[])

throws IOException{

ServerSocket svrsoc=null;

Socket soc=null;

Page 16: Advanced Network Programming

InputStream is=null; OutputStream os=null; DataInputStream in=null; PrintStream out=null; try{ svrsoc=new ServerSocket(8000); soc=svrsoc.accept(); is=soc.getInputStream(); in=new DataInputStream(is); os=soc.getOutputStream(); out=new PrintStream(os); InetAddress clientIP=soc.getInetAddress();

Page 17: Advanced Network Programming

System.out.println("Client's IP address:"+ clientIP);

int port; port=soc.getPort(); System.out.println("Client's port:"+port); out.println("Welcome!..."); String str=in.readLine(); while(!str.equals("quit")){ System.out.println("Client said:"+str); str=in.readLine(); } System.out.println("Client want to leave."); }

Page 18: Advanced Network Programming

catch(Exception e) {

System.out.println("Error:"+e);

}

finally{

is.close();

os.close();

soc.close();

System.exit(0);

}

}}

( 2 )客户方源程序

Page 19: Advanced Network Programming

图 1-6 客户方 UML 模型简图

Page 20: Advanced Network Programming

图 6 描述了客户方不完全规范的 UML 模型简图 。 它 描 述 了 类 TcpServer 继 承 了 Object 类(可默认),以及它依赖的类。代码如下:

import java.net.*;

import java.io.*;

public class TcpClient{

static public void main(String args[])

throws IOException{

Socket soc=null;

InputStream is=null;

OutputStream os=null;

Page 21: Advanced Network Programming

DataInputStream in=null; PrintStream out=null; String strin=null; try{soc=new Socket("localhost",8000); System.out.println("Connecting to the Server..."); is=soc.getInputStream(); os=soc.getOutputStream(); in=new DataInputStream(is); out=new PrintStream(os); strin=in.readLine();

Page 22: Advanced Network Programming

System.out.println("Server said:"+strin);

byte bmsg[] = new byte[20];

System.in.read(bmsg);

String msg=new String(bmsg,0);

msg=msg.trim();

while(!msg.equals("quit")){

out.println(msg);

System.in.read(bmsg);

msg=new String(bmsg,0);

msg=msg.trim();

}

Page 23: Advanced Network Programming

out.println(msg); } catch (Exception e) { System.out.println("Error: "+e); } finally{ is.close(); os.close(); soc.close(); System.exit(0); } }}

Page 24: Advanced Network Programming

服务器端运行结果如图 7 所示:

图 7 服务器端运行结果

Page 25: Advanced Network Programming

客户端运行结果如图 8 所示:

图 8 客户端运行结果

Page 26: Advanced Network Programming

2. 综合示例:基于浏览器 / 服务器方式的网络聊天室

例 8 如果聊天室有 n 个网友在聊天,每个网友聊天时其他网友都“看到“聊的内容。

ChatServer 的运行结构如图 1-9 所示。该例涉及到线程、小应用程序、 Socket 等多方面知识。

图 9 ChatServer 的运行结构 ( 下页 )

Page 27: Advanced Network Programming
Page 28: Advanced Network Programming

(1) 聊天服务者 ChatServer 实现源程序如下:import java.net.*;

import java.io.*;

import java.util.*;

public class ChatServer {

public static void main(String args[])

{

ServerSocket socket=null;

Vector m_threads=new Vector();

System.out.println("listen...");

try

Page 29: Advanced Network Programming

{ socket=new ServerSocket(5555);} catch(Exception e) { System.out.println( "new ServerSocket()failed!"); return; } try { int nid=0; while(true) { Socket s=socket.accept();

Page 30: Advanced Network Programming

System.out.println("accepted");

ServerThread st=new ServerThread

(s,m_threads);

st.setID(nid++);

m_threads.addElement(st);

new Thread(st). start();

for(int i=0;i<m_threads.size();i++)

{ ServerThread st1=

(ServerThread)m_threads.elementAt(i);

st1.write("<#>welcome "+st.getID()+" to

enter chatroom!");

Page 31: Advanced Network Programming

}

System.out.println("Listen again...");

}

}

catch(Exception e)

{ System.out.println("Server is down...");}

}

}

class ServerThread implements Runnable

{ Vector m_threads;

Socket m_socket=null;

Page 32: Advanced Network Programming

DataInputStream m_in=null;

DataOutputStream m_out=null;

int m_nid;

public ServerThread(Socket s,Vector threads)

{

m_socket=s;

m_threads=threads;

try

{

m_in=new DataInputStream

(m_socket.getInputStream());

Page 33: Advanced Network Programming

m_out=new DataOutputStream (m_socket.getOutputStream()); } catch(Exception e) {} } public void run() { System.out.println("thread is running"); try { while(true)

Page 34: Advanced Network Programming

{ String s=m_in.readUTF(); if (s==null) break; if (s.trim().equals ("leave")) for (int i=0;i<m_threads.size();i++) { ServerThread st=(ServerThread) m_threads.elementAt(i); st.write("*** "+getID()+" leave..."+"***"); } else for(int i=0;i<m_threads.size();i++) {

Page 35: Advanced Network Programming

ServerThread st=(ServerThread)

m_threads.elementAt(i);

st.write("<"+getID()+">"+s);

}

}

}

catch(Exception e)

{ e.printStackTrace(); }

m_threads.removeElement(this);

try

{ m_socket.close();}

Page 36: Advanced Network Programming

catch (Exception e){} } public void write (String msg) {synchronized(m_out) { try {m_out.writeUTF(msg);} catch(IOException e){} } } public int getID() {return m_nid;}

Page 37: Advanced Network Programming

public void setID(int nid)

{m_nid=nid;}

}

(2) 聊天者 ChatApplet1 源程序/*

<APPLET

CODE=ChatApplet1.class

WIDTH=200

HEIGHT=200>

</APPLET>*/

import java.awt.*;

Page 38: Advanced Network Programming

import java.applet.*;import java.io.*;import java.net.*;public class ChatApplet1 extends Applet implements Runnable{ TextArea m_textarea; TextField m_textfield; DataInputStream m_in; DataOutputStream m_out; public void init() { setLayout(null);

Page 39: Advanced Network Programming

setSize(426,266); m_textarea=new TextArea(10,10); m_textfield=new TextField(); m_in=null; m_out=null; try{ URL url=getCodeBase(); InetAddress inetaddr= InetAddress.getByName(url.getHost()); Socket m_socket; System.out.println("Server:"+inetaddr+" "+url.

getHost()+" "+url.getProtocol()); m_socket=new Socket(inetaddr,5555);

Page 40: Advanced Network Programming

m_in=new DataInputStream(m_socket.getInputStream());

m_out=new DataOutputStream(m_socket.getOutputStream());

} catch (Exception e) {System.out.println("Error:"+e);} setLayout(new BorderLayout()); add("Center",m_textarea); add("South",m_textfield); m_textarea.setEditable(false); new Thread(this).start();

Page 41: Advanced Network Programming

} public boolean handleEvent(Event event) { String b=m_textfield.getText(); if((event.target==m_textfield)&& (event.id==Event.ACTION_EVENT)) { m_textfield.setText(""); try{ m_out.writeUTF(b); } catch(IOException e){} return true;

Page 42: Advanced Network Programming

} else return super.handleEvent(event); } public void run() { try { while(true) { String s=m_in.readUTF(); if(s!=null) m_textarea.append(s+"\n"); } }

Page 43: Advanced Network Programming

catch(Exception e) { m_textarea.append("Network problem

or Server down.\n"); m_textfield.setVisible(false); } } public void stop() { try {m_out.writeUTF("leave");} catch(IOException e){} } }

Page 44: Advanced Network Programming

Socket programming with UDP

UDP: no “connection” between client and server

• no handshaking• UDP: transmitted

data may be received out of order, or lost

application viewpoint

UDP provides unreliable transfer of groups of bytes (“datagrams”)

between sockets

UDP socket identified by :dest IP address, dest port number

- sender explicitly attaches IP address and port of destination to each pac

ket

- server must extract IP address, port of sender from received packet

Page 45: Advanced Network Programming

Example: Java server (UDP)

import java.io.*; import java.net.*; class UDPServer { public static void main(String args[]) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

serverSocket.receive(receivePacket);

Createdatagram socket

at port 9876

Create space forreceived datagram

Receivedatagram

Page 46: Advanced Network Programming

Example: Java server (UDP), cont String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } }

}

Get IP addrport #, ofsender

Write out datagramto socket

End of while loop,loop back and wait foranother datagram

Create datagramto send to client

Page 47: Advanced Network Programming

Example: Java client (UDP)

import java.io.*; import java.net.*; class UDPClient { public static void main(String args[]) throws Exception { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine();

sendData = sentence.getBytes();

Createinput stream

Create client socket

Translate hostname to IP

address using DNS

Page 48: Advanced Network Programming

Example: Java client (UDP), cont.

DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }

}

Create datagram with data-to-send,

length, IP addr, port

Send datagramto server

Read datagramfrom server

Page 49: Advanced Network Programming

Socket programming with TCP

Client must contact server• server process must first be

running• server must have created

socket (door) that welcomes client’s contact

Client contacts server by:• creating client-local TCP socket• specifying IP address, port

number of server process• When client creates socket:

client TCP establishes connection to server TCP

• When contacted by client, server TCP creates new socket for server process to communicate with client– allows server to talk with

multiple clients– source port numbers use

d to distinguish clients

TCP provides reliable, in-order transfer of bytes

between client and server

application viewpoint

Page 50: Advanced Network Programming

Example: Java client (TCP)

import java.io.*; import java.net.*; class TCPClient {

public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence;

BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

Socket clientSocket = new Socket("hostname", 6789);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

Createinput stream

Create client socket,

connect to server

Createoutput stream

attached to socket

Page 51: Advanced Network Programming

Example: Java client (TCP), cont.

BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n');

modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close(); } }

Createinput stream

attached to socket

Send lineto server

Read linefrom server

Page 52: Advanced Network Programming

Example: Java server (TCP)import java.io.*; import java.net.*;

class TCPServer {

public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept();

BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

Createwelcoming socket

at port 6789

Wait, on welcomingsocket for contact

by client

Create inputstream, attached

to socket

Page 53: Advanced Network Programming

Example: Java server (TCP), cont

DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine();

capitalizedSentence = clientSentence.toUpperCase() + '\n';

outToClient.writeBytes(capitalizedSentence); } } }

Read in linefrom socket

Create outputstream,

attached to socket

Write out lineto socket

End of while loop,loop back and wait foranother client connection

Page 54: Advanced Network Programming

WebBrowser

import java.io.IOException;

import java.net.URL;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.event.*;

public class WebBrowser extends JFrame {

JPanel contentPane;

BorderLayout borderLayoutAll = new BorderLayout();

Page 55: Advanced Network Programming

JLabel jLabelPrompt = new JLabel();

JPanel jPanelMain = new JPanel();

BorderLayout borderLayoutMain = new BorderLayout();

JTextField textFieldURL = new JTextField(); JEditorPane jEditorPane = new JEditorPane(); public WebBrowser() {

try {

Init();

Page 56: Advanced Network Programming

} catch (Exception e) {

e.printStackTrace();

}

}

private void Init() throws Exception {

contentPane = (JPanel) getContentPane();

contentPane.setLayout(borderLayoutAll);

jPanelMain.setLayout

(borderLayoutMain);

jLabelPrompt.setText(" 请输入 URL");

textFieldURL.setText("");

Page 57: Advanced Network Programming

textFieldURL.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) { textFieldURL_actionPerformed(e);

}});

jEditorPane.setEditable(false); jEditorPane .addHyperlinkList

ener(new javax.swing.event.HyperlinkListener() {

public void hyperlinkUpdate(HyperlinkEvent e) {

Page 58: Advanced Network Programming

jEditorPane_hyperlinkUpdate(e);}

});JScrollPane scrollPane = new JScrollPane();scrollPane.getViewport().add(jEditorPane);jPanelMain.add(textFieldURL, "North");jPanelMain.add(scrollPane, "Center");contentPane.add(jLabelPrompt, "North");contentPane.add(jPanelMain, "Center");enableEvents(AWTEvent.WINDOW_EVENT_MA

SK);this.setSize(new Dimension(600, 500));this.setTitle("Browser ");

Page 59: Advanced Network Programming

this.setVisible(true);}void textFieldURL_actionPerformed(ActionEvent e) { try {jEditorPane.setPage("http://"+textFieldURL.getText());

textFieldURL.setText("http://"+textFieldURL.getText());

} catch (IOException ex){

JOptionPane msg = new JOptionPane();

Page 60: Advanced Network Programming

JOptionPane.showMessageDialog(this, "URL 地址不正确: "

+ textFieldURL.getText(), " 输入不正确! ", 0);

}}

void jEditorPane_hyperlinkUpdate(HyperlinkEvent e) {

if (e.getEventType() == javax.swing.event.HyperlinkEvent.EventType.ACTIVATED) {

Page 61: Advanced Network Programming

try {

URL url = e.getURL(); jEditorPane.setPage(url); te

xtFieldURL.setText(url.toString()); } catch (IOException io) {

JOptionPane msg = new JOptionPane();

JOptionPane.showMessageDialog(this, " 打开 该链接失败! ", " 输入不正确! ", 0);

Page 62: Advanced Network Programming

}}

}protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);if (e.getID() == WindowEvent.WINDOW_CLOSI

NG) {System.exit(0);

}}

public static void main(String[] args) { new WebBrowser();}}

Page 63: Advanced Network Programming

chatimport java.net.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.GregorianCalendar;import javax.swing.JDialog;public class chat extends Frame implements ActionListe

ner {Label label1 = new Label(" 消息目的地址 ");TextArea input = new TextArea("", 7, 14, TextArea.SCROLLBARS_BOTH);TextArea output = new TextArea("", 8, 14, TextArea.SCROLLBARS_BOTH);

Page 64: Advanced Network Programming

TextField IPAdd = new TextField("127.0.0.1");Button send = new Button(" 发送 ");GregorianCalendar time = new GregorianCalendar();

chat() {super("chat");setLayout(null);setLocation(168, 168);this.setSize(398, 380);this.setResizable(false); this.setBackground(new

Color(216, 216, 216));

Page 65: Advanced Network Programming

input.setBackground(new Color(255, 255, 255));input.setFont(new Font("Times New Roma

n", Font.BOLD, 15));input.setForeground(Color.black);input.setBounds(8, 218, 388, 106);

output.setBackground(new Color(255, 255, 255));

output.setFont(new Font("Times New Roman", Font.PLAIN, 12));

output.setForeground(Color.black);output.setBounds(8, 44, 388, 166);

Page 66: Advanced Network Programming

output.setEditable(false);

send.setFont(new Font(" 新宋体 ", Font.PLAIN, 12));

send.setLocation(136, 350);

send.setSize(120, 22);

label1.setFont(new Font(" 宋体 ", Font.PLAIN, 12));

label1.setForeground(new Color(0, 0, 192));

label1.setBounds(8, 328, 160, 16);

IPAdd.setFont(new Font(" 新宋体 ", Font.PLAIN, 12));

Page 67: Advanced Network Programming

IPAdd.setLocation(8, 350);IPAdd.setSize(120, 19);add(input);add(label1);add(output);add(IPAdd);add(send);addWindowListener(new closeWin());send.addActionListener(this);show();

waitForData();}

Page 68: Advanced Network Programming

public void actionPerformed(ActionEvent e) {

if (e.getSource() == send)

sendData();

}

public static void main(String args[]) {

new chat();

}

void sendData() {

try {

String msg = input.getText();

if (msg.equals(""))

return;

input.setText("");

Page 69: Advanced Network Programming

String ad = IPAdd.getText();

InetAddress tea = InetAddress.getLocalHost();

String asd = tea.getHostAddress(); output.append("[" + asd + "]:(" + time.

get(GregorianCalendar.YEAR)

+ "-" + time.get(GregorianCalendar.MONTH) + "-"

+ time.get(GregorianCalendar.DATE) + " "

+ time.get(GregorianCalendar.HOUR) + ":"

Page 70: Advanced Network Programming

+ time.get(GregorianCalendar.MINUTE) + ":"

+ time.get(GregorianCalendar.SECOND) + ") " + "\n" + msg

+ "\n");

msg = "From [" + asd + "]:(" + time.get(GregorianCalendar.YEAR)

+ "-" + time.get(GregorianCalendar.MONTH) +

"-" + time.get(GregorianCalendar.DATE) + " "

+ time.get(GregorianCalendar.HOUR) + ":"

Page 71: Advanced Network Programming

+ time.get(GregorianCalendar.MINUTE) + ":"

+ time.get(GregorianCalendar.SECOND) + ") \n" + msg;

InetAddress address = InetAddress.getByName(ad);

int len = msg.length();

byte[] message = new byte[len];

msg.getBytes(0, len, message, 0);

DatagramPacket packet = new DatagramPacket(message, len, address,5678);

Page 72: Advanced Network Programming

DatagramSocket socket = new DatagramSocket();

socket.send(packet);

} catch (Exception e) {

}

}

void waitForData() {

try {

byte[] buffer = new byte[1024];

DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

Page 73: Advanced Network Programming

DatagramSocket socket = new DatagramSocket(5678);

while (true) {

socket.receive(packet);

String s = new String(buffer, 0, 0, packet.getLength());

output.append(s + "\n");

packet = new DatagramPacket(buffer, buffer.length);

}

} catch (Exception e) {

}

}

}

Page 74: Advanced Network Programming

class closeWin extends WindowAdapter {

public void windowClosing(WindowEvent e) {

Frame fr = (Frame) (e.getSource());

fr.dispose();

System.exit(0);

}

}

Page 75: Advanced Network Programming

小结 : 通信协议是通信双方的约定。 TCP/IP 协议是 Internet 网络层、传送层、应用层一系列通信协议的习惯称呼。 URL 类封装了 www 资源( Web 页、文本文件、图形文件、声频片段等)定位协议。利用 URL 类,可以访问 www 资源。 套接口是基于传送层协议的网络进程之间通信的抽象。套接口按使用的协议不同分为面向连接的 Socket 和不连接的 Socket 。套接口的端口是定位主机上通信的网络进程。使用套接口通信的主动方叫客户,被动方叫服务者。客户和服务者利用 Socket 通信,双方的作用各不一样。客户程序利用 TCP 、请求连接的服务器地址(包括端口)建立自己的套接口,服务器利用指定的端口,建立自己的套接口,等待客户服务请求,并为服务处理结果建立新的套接口与客户连接。