- 浏览: 155435 次
- 性别:
- 来自: 湖南
文章分类
最新评论
-
viking_wu:
Android POST方式提交数据 -
hsiunien:
不能正常调用 init android4.3上 是否可以 ...
Android JS双向调用 -
liaokang.java:
Apple.Chen 写道你确定这是插入排序而不是冒泡?插入排 ...
java之插入排序 -
Apple.Chen:
你确定这是插入排序而不是冒泡?
java之插入排序 -
ct19900913:
顶一个!!!
Android ContentProvider共享数据
提到java的网络编程,大家肯定会想到TCP,UDP协议,下面对这两种协议进行相应介绍
1.TCP是一种面向连接的保证可靠传输的协议,通过TCP协议传输,得到的是一个顺序的无差错的数据流,发送方和接收方两个socket之间必须建立连接,一旦连接起来,双向均可以进行发送或接收操作
2.UDP是一种无连接的协议,每个数据包报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达时间以及内容的正确性都是不能保证的
也许你会问既然UDP是这么一个不可靠的协议,那为什么还有它的价值,原因有几个
a.可靠的传输必然是要付出代价的,对数据的校验必然占用计算机处理时间和网络带宽,因此TCP的传输效率不如UDP
b.在许多应用中没必要保证严格的传输可靠性,比如视频会议系统,只需保证连贯性就可以了,这种情况下使用UDP合理一些
下面是我通过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自定义Annotation
2013-08-23 11:41 964自定义Annotation概念篇 来看一个最简单的annota ... -
JBPM安装和配置
2012-09-10 21:30 4520在介绍JBPM的安装之前可能有人会问,JBPM不是说它 ... -
java NIO
2011-09-26 10:25 1346原有的I/O操作都是以字节为单位进行读写的,虽然应用时 ... -
java多线程下载网络资源
2011-09-09 10:43 1440在java中,我们可以通过URL和HttpURLConnect ... -
java方法参数是引用调用还是值调用
2011-08-19 14:17 1013方法调用(call by) 是一个标准的计算机科学术语 ... -
HashSet介绍
2011-08-18 21:35 939(1) 为啥要用HahSet? 假如我们现在想要在一大 ... -
java日期转化"BUG"
2011-08-05 16:43 1014最近看了一个有意思的帖子,拿来分享一下 SimpleDa ... -
java虚拟机基础知识
2011-06-22 10:35 11541.java虚拟机与程序的生命周期 在如下几种情况下,java ... -
HashMap底层的实现
2011-06-20 13:20 7438首先我们来看看HashMap的底层源码 /** ... -
java动态代理分析
2011-06-07 12:48 9121.所谓动态代理类是这样一种class,首先它是在运行期生成的 ... -
TreeSet分析
2011-06-04 21:08 10351. |——SortedSet接口——TreeSe ... -
equals和hashCode方法分析
2011-06-04 17:51 9461.HashSet存放的是无序,不能重复的对象,当添加一个对象 ... -
ArrayList与LinkedList分析
2011-06-04 11:49 1000先看看ArrayList源码 public class A ... -
HashMap和Hashtable分析
2011-05-26 22:17 10121.先说继承关系吧 Java代码 public class H ... -
java的克隆
2011-05-08 22:02 1026所谓复制就是将一份东西拷贝一份,在java中有浅复制和深复制的 ... -
java线程通信
2011-05-08 16:39 789一说到线程通信我们就会想到生产者和消费者,哲学家就餐问题,下面 ... -
java多线程及synchronized
2011-05-08 13:31 640通常我们所说的程序它只是一个静态的概念,而进程是其动态性的体现 ... -
java反射机制2
2011-05-06 08:55 909package com.lamp.test; pub ... -
java反射机制
2011-05-05 19:47 1016反射是java一大特征,没有它java体现不出它那些优点,更别 ... -
JPA及联合主键的使用
2011-04-26 20:07 1606JPA全称为java persistence AP ...
相关推荐
Java网络编程案例教程习题参考答案 Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程...
Java网络编程是Java开发中的重要领域,它涵盖了网络应用程序的设计、实现和调试。在这个主题下,我们可以探讨多个关键知识点: 1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过...
《Java程序设计之网络编程》是一本专注于Java网络编程的教材,它涵盖了网络通信的基础理论以及Java语言在实现网络应用中的各种技术。该资源包括课件和源码,旨在帮助学习者通过实践来深入理解Java网络编程的核心概念...
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
java网络编程.pdf
"Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...
Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助开发者提升对这一领域的理解。 1. **基础概念**: - **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络...
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网络编程
Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...
一、Java网络编程基础 1. Socket编程:Java中的Socket类和ServerSocket类是TCP编程的基础。Socket用于建立客户端和服务器之间的连接,而ServerSocket则监听特定端口,等待客户端的连接请求。通过这两个类,开发者...
《Java网络编程精解》是孙卫琴老师的一本经典教程,主要涵盖了Java语言在网络编程领域的深度解析。这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等...
在TCP/IP协议栈中,Java网络编程通常涉及以下层次: 1. 应用层:这一层包含HTTP、FTP、SMTP等应用协议。Java的`HttpURLConnection`和`HttpClient`库可以处理HTTP通信,而`MailAPI`则处理电子邮件发送。 2. 传输层...
这份《java网络编程》的电子课件,显然是为了帮助开发者深入理解和掌握这些核心概念而设计的。 首先,我们需要理解Java在网络编程中的基础——Socket编程。Java的Socket类提供了客户端与服务器端通信的基本接口,它...