`
liaokang.java
  • 浏览: 155435 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

java之网络编程

    博客分类:
  • java
阅读更多
提到java的网络编程,大家肯定会想到TCP,UDP协议,下面对这两种协议进行相应介绍
1.TCP是一种面向连接的保证可靠传输的协议,通过TCP协议传输,得到的是一个顺序的无差错的数据流,发送方和接收方两个socket之间必须建立连接,一旦连接起来,双向均可以进行发送或接收操作
2.UDP是一种无连接的协议,每个数据包报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达时间以及内容的正确性都是不能保证的

也许你会问既然UDP是这么一个不可靠的协议,那为什么还有它的价值,原因有几个
a.可靠的传输必然是要付出代价的,对数据的校验必然占用计算机处理时间和网络带宽,因此TCP的传输效率不如UDP
b.在许多应用中没必要保证严格的传输可靠性,比如视频会议系统,只需保证连贯性就可以了,这种情况下使用UDP合理一些

下面是我通过TCP连接实现多线程之间通信的小例子
首先是客户端代码
package com.lamp.client;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatClient extends JFrame {
	private static final long serialVersionUID = 1164739305605633090L;

	private Socket socket = null;

	private JTextField text = new JTextField();

	private JTextArea textArea = new JTextArea();

	private DataOutputStream dos = null;

	private DataInputStream dis = null;
	
	private boolean flag = false;

	public void launchFrame() {
		this.setLocation(400, 400);
		this.setSize(500, 300);
		this.add(textArea, BorderLayout.NORTH);
		this.add(text, BorderLayout.SOUTH);
		this.textArea.setEditable(false);
		this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				try {
					if (dos != null)
						dos.close();
					if (dis != null)
						dis.close();
					if (socket != null)
						socket.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				System.exit(0);
			}

		});
		this.text.addActionListener(new MessageSendAction());
		this.setVisible(true);
		connect();
	}

	class MessageSendAction implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			String message = ChatClient.this.text.getText().trim();
			text.setText("");
			try {
				dos.writeUTF(message);		//从输入框中得到数据后发给服务器端
				dos.flush();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}

	}

	public void connect() {
		try {
			socket = new Socket("127.0.0.1", 2222);		//和服务器端连接
			dis = new DataInputStream(socket.getInputStream());
			dos = new DataOutputStream(socket.getOutputStream());
			flag =true;
			new Thread(new RecieveMessage()).start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	class RecieveMessage implements Runnable {		//监听服务器端发来的数据流

		public void run() {
			try {
				while (flag) {
					String message = dis.readUTF();
					textArea.setText(textArea.getText() + message + "\n");
					System.out.println("server message back" + message);
				}

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

	}

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

	}
}



服务器段代码

package com.lamp.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {
	private ServerSocket ss = null;

	private List<Client> clients = new ArrayList<Client>();

	private boolean portFlag = false;

	public ChatServer() {
		try {
			ss = new ServerSocket(2222);
			portFlag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void begin() {
		try {
			while (portFlag) {
				Socket socket = ss.accept();
				Client client = new Client(socket); // 和客户端连接并为每个客户端分配一个线程
				new Thread(client).start();
				clients.add(client);
				System.out.println("one client connected");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ss != null) {
				try {
					ss.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	class Client implements Runnable { // 每个客户端的连接为一个Client线程
		private Socket socket = null;

		private DataInputStream dis = null;

		private DataOutputStream dos = null;

		private boolean flag = false;

		public Client(Socket socket) {
			this.socket = socket;
			try {
				dis = new DataInputStream(this.socket.getInputStream());
				dos = new DataOutputStream(this.socket.getOutputStream());
				flag = true;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void run() {
			try {
				while (flag) {
					String message = dis.readUTF();
					if (message != null) {
						for (int i = 0; i < clients.size(); i++) {
							Client client = clients.get(i); // 服务器端得到客户端发来的数据并分发给每个连接的客户端
							client.send(message);
						}
						System.out.println(message);
					}
				}

			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (dis != null)
						dis.close();
					if (dos != null)
						dos.close();
					if (socket != null)
						socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		private void send(String message) {
			try {
				dos.writeUTF(message);
			} catch (IOException e) {
				clients.remove(this);
				e.printStackTrace();
			}
		}

	}

	public static void main(String[] args) {
		new ChatServer().begin();
	}

}


以上只是一个模拟线程通信的小例子,有些异常没有得到很好的处理,不足之处请见谅

下面是模拟UDP通信的例子
接收方
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPTest2 {
	public static void main(String[] args) throws Exception {
		//接收消息,监听5000端口
		DatagramSocket socket = new DatagramSocket(5000);
		byte[] buffer = new byte[500];
		DatagramPacket packet = new DatagramPacket(buffer, 500);
		socket.receive(packet);
		System.out.println(new String(buffer, 0, packet.getLength()));
		
		//发送消息
		String answer = "I am fine, thank you";
		//通过发送过来的数据包能得到源地址和端口
		DatagramPacket packet2 = new DatagramPacket(answer.getBytes(), answer
				.length(), packet.getAddress(), packet.getPort());
		socket.send(packet2);
		
		socket.close();
	}
}



发送方
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPTest1 {
	public static void main(String[] args) throws Exception {
		//发送消息,注意传输的数据不能超过64KB
		DatagramSocket socket = new DatagramSocket();
		String str = "How are you?";
		DatagramPacket packet = new DatagramPacket(str.getBytes(),str
				.length(),InetAddress.getByName("localhost"),5000);
		socket.send(packet);
		
		//接受消息
		byte[] buffer = new byte[200]; 
		DatagramPacket packet2 = new DatagramPacket(buffer,200);
		socket.receive(packet2);
		System.out.println(new String(buffer,0,packet2.getLength()));
		
		socket.close();
	}
}

分享到:
评论

相关推荐

    Java网络编程案例教程习题参考答案 .pdf

    Java网络编程案例教程习题参考答案 Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程...

    Java网络编程/Java网络编程实例

    Java网络编程是Java开发中的重要领域,它涵盖了网络应用程序的设计、实现和调试。在这个主题下,我们可以探讨多个关键知识点: 1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过...

    《Java程序设计之网络编程》

    《Java程序设计之网络编程》是一本专注于Java网络编程的教材,它涵盖了网络通信的基础理论以及Java语言在实现网络应用中的各种技术。该资源包括课件和源码,旨在帮助学习者通过实践来深入理解Java网络编程的核心概念...

    Java网络编程第三版.pdf

    《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...

    Java网络高级编程Java网络高级编程

    Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程

    java网络编程第四版pdf

    《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...

    Java网络编程(第4版)PDF

    《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...

    java网络编程.pdf

    java网络编程.pdf

    Java网络编程实验报告.pdf

    "Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...

    Java Socket网络编程.pdf

    Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...

    Java网络编程期末考试复习题库+答案

    Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...

    java网络编程

    在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助开发者提升对这一领域的理解。 1. **基础概念**: - **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络...

    java网络编程pdf

    java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf

    Java网络编程实践课程设计报告.pdf

    Socket 编程是 Java 网络编程的核心技术之一。Socket 是一种网络通信机制,允许不同的应用程序之间进行通信。Java 提供了 Socket 类和 ServerSocket 类来实现 Socket 编程。Socket 编程可以实现客户端/服务器端的...

    [Java网络编程(第3版,2004)].(Java.Network.Prog.epub

    Java网络编程

    《Java网络编程实例:Java网络编程实例》

    Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...

    Java程序设计之网络编程

    一、Java网络编程基础 1. Socket编程:Java中的Socket类和ServerSocket类是TCP编程的基础。Socket用于建立客户端和服务器之间的连接,而ServerSocket则监听特定端口,等待客户端的连接请求。通过这两个类,开发者...

    Java网络编程精解(孙卫琴)电子教案

    《Java网络编程精解》是孙卫琴老师的一本经典教程,主要涵盖了Java语言在网络编程领域的深度解析。这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等...

    java网络高级编程

    在TCP/IP协议栈中,Java网络编程通常涉及以下层次: 1. 应用层:这一层包含HTTP、FTP、SMTP等应用协议。Java的`HttpURLConnection`和`HttpClient`库可以处理HTTP通信,而`MailAPI`则处理电子邮件发送。 2. 传输层...

    《java网络编程》(PPT)

    这份《java网络编程》的电子课件,显然是为了帮助开发者深入理解和掌握这些核心概念而设计的。 首先,我们需要理解Java在网络编程中的基础——Socket编程。Java的Socket类提供了客户端与服务器端通信的基本接口,它...

Global site tag (gtag.js) - Google Analytics