大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
package com.weixin.test;
成都创新互联是一家专业提供兰陵企业网站建设,专注与成都网站建设、网站制作、html5、小程序制作等业务。10年已为兰陵众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;
public class ScoketTest {
@Test
public void client() throws Exception{
InetAddress i=InetAddress.getByName("127.0.0.1");
Socket s=new Socket(i, 9000);
OutputStream outputStream = s.getOutputStream();
outputStream.write("服务端你好,我是客户端哦!".getBytes());
s.shutdownOutput();
InputStream inputStream=s.getInputStream();
int length=0;
byte[] bytes=new byte[1024];
while ((length=inputStream.read(bytes))!=-1) {
System.err.println(new String(bytes,0,length));
}
inputStream.close();
outputStream.close();
s.close();
}
@Test
public void server() throws Exception{
ServerSocket serverSocket=new ServerSocket(9000);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
int length=0;
byte[] bytes=new byte[1024];
while ((length=inputStream.read(bytes))!=-1) {
System.err.println(new String(bytes, 0,length));
}
outputStream.write("客户端你好,本王已收到!".getBytes());
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
你说的我明白。如果真正使用alohal协议的时候,所有的机器都可以检测网络电平变化的是吧?但是使用Java编写模拟程序的话,我们并不能可能检测电平的变换,只能通过一定的手段来模拟这个过程。如果你将一个包裹群发,这样所有的机器都可以接受这个包,这样就可以做到所有机器模拟检测电平变化的这个要求。我认为这个是最有说服力的模拟方法了。
线程需要使用Thread类型,重写里面的run函数,调用start()启动线程,具体可以搜索一把Thread,例子遍地都是。
UDP协议使用Socket类型,初始化的时候参数里面绑定(或者初始化好以后直接调用bind绑定端口,一般输出不用绑定,监听的时候需要绑定)。调用里面的getOutputStream得到输入流。调用getInputStream得到输入流。
OutputStream:输出流,用于向网络中输出数据。调用其中的write函数进行输出,函数的参数就是输出的byte数组。
InputStream: 输入流,用于接受网络里面的数据。调用其中的read可以得到输入的包。
String:你要输出的字符串,调用里面的getBytes可以得到String的byte数组。
其它的应该用不到什么了吧。
**********************************
1.发送字符串的话用byte[]就可以啊。用Socket类里面的getOutputStream可以获得一个发送数据的OutputStream类对象。这个类对象有一个函数write(byte[] b) 可以向网络写byte[]。一个字符串可以通过String类中的getBytes() 转化成byte[]。这样总该明白了吧
2.说一下我的思路:开一个端口A发送UDP包(广播给端口B),用于模拟发送,用一个线程(线程1)来跑。开端口B接受局域网内的包,用另外一个线程(线程2)来跑。在发送UDP包的时候,将变量mark置1,发送完置0。线程2如果接受到一个不是从本机发送的包,而且此时mark是1(说明本机和另外一个机器同时在发包),发生了冲突,表示线程1这次发送的包失败。
网络上的系统结构多为客户/服务器模式 服务器端负责数据和图像等的存储 维护 治理以及传递 客户端则负责人机界面的操作 送出需求及显示收回的数据 下面介绍一下如何使用Java来进行网络编程 ) 由于客户端通过IE同服务器建立联系 所以客户端使用Applet 服务器端使用Application ) 服务器应设置成多线程 应答多个客户的请求 ) 两端通信使用SOCKET机制 Java中输入/输出流概念 过滤流DataInputStream 和DataOutputStream 除了分别作为FilterInputStream 和FilterOutputStream的子类外 还分别实现了接口DataInput 和DataOutput 接口DataInput 中定义的方法主要包括从流中读取基本类型的数据 读取一行数据 或者读取指定长度的字节数 如readBoolean() readInt() readLine() readFully()等 接口DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组 如writeChar() writeDouble() DataInputStream可以从所连接的输入流中读取与机器无关的基本类型数据 用以实现一种独立于具体平台的输入方式 DataInputStream 可以向所连接的输出流写入基本类型的数据 Socket 机制 Socket是面向客户/服务器模型设计的 网络上的两个程序通过一个双向的通讯连接实现数据的交换 这个双向链路的一端称为一个Socket Socket通常用来实现客户方和服务方的连接 客户程序可以向Socket写请求 服务器将处理此请求 然后通过Socket将结果返回给用户 Socket通信机制提供了两种通讯方式 有联接和无联接方式 分别面向不同的应用需求 使用有联接方式时 通信链路提供了可靠的 全双工的字节流服务 在该方式下 通信双方必须创建一个联接过程并建立一条通讯链路 以后的网络通信操作完全在这一对进程之间进行 通信完毕关闭此联接过程 使用无联接方式时其系统开销比无联接方式小 但通信链路提供了不可靠的数据报服务 不能保证信源所传输的数据一定能够到达信宿 在该方式下 通信双方不必创建一个联接过程和建立一条通讯链路 网络通信操作在不同的主机和进程之间转发进行 Java语言简介Java语言的优点主要表现在 简单 面向对象 多线程 分布性 体系结构中立 安全性等方面 ( ) 简单性Java与C++语言非常相近 但Java比C++简单 它抛弃了C++中的一些不是绝对必要的功能 如头文件 预处理文件 指针 结构 运算符重载 多重继续以及自动强迫同型 Java实现了自动的垃圾收集 简化了内存治理的工作 这使程序设计更加简便 同时减少了出错的可能 ( ) 面向对象Java提供了简单的类机制和动态的构架模型 对象中封装了它的状态变量和方法 很好地实现了模块化和信息隐藏 而类则提供了一类对象的原型 通过继续和重载机制 子类可以使用或重新定义父类或超类所提供的方法 从而既实现了代码的复用 又提供了一种动态的解决方案 Java是一种完全面向对象的程序设计语言 它除了数组 布尔和字符三个基本数据类型外的其它类都是对象 它不再支持全局变量 在Java中 假如不创建新类就无法创建程序 Java程序在运行时必须先创建一个类的实例 然后才能提交运行 Java同样支持继续特性 Java的类可以从其它类中继续行为 但Java只支持类的单重继续 即每个类只能从一个类中继续 Java支持界面 界面答应程序员定义方法但又不立即实现 一个类可以实现多个界面 利用界面可以得到多重继续的许多优点而又没有多重继续的问题 ( ) 多线程多线程使应用程序可以同时进行不同的操作 处理不同的事件 在多线程机制中 不同的线程处理不同的任务 他们之间互不干涉 不会由于一处等待影响其他部分 这样轻易实现网络上的实时交互操作 Java程序可以有多个执行线程 如可以让一个线程进行复杂的计算 而让另一个线程与用户进行交互 这样用户可以在不中断计算线程的前提下与系统进行交互 多线程保证了较高的执行效率 ( ) 分布性Java是面向网络的语言 通过它提供的类库可以处理TCP/IP协议 用户可以通过URL地址在网络上很方便的访问其他对象 ( ) 体系结构中立Java是一种网络语言 为使Java程序能在网络的任何地方运行 Java解释器生成与体系结构无关的字节码结构的文件格式 Java为了做到结构中立 除生成机器无关的字节码外 还制定了完全统一的语言文本 如Java的基本数据类型不会随目标机的变化而变化 一个整型总是 位 一个长整型总是 位 为了使Java的应用程序能不依靠于具体的系统 Java语言环境还提供了用于访问底层操作系统功能的类组成的包 当程序使用这些包时 可以确保它能运行在各种支持Java的平台上 lishixinzhi/Article/program/Java/hx/201311/25926
/**
* 基于UDP协议的聊天程序
*
* 2007.9.18
* */
//导入包
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.net.*;
public class Chat extends JFrame implements ActionListener
{
//广播地址或者对方的地址
public static final String sendIP = "172.18.8.255";
//发送端口9527
public static final int sendPort = 9527;
JPanel p = new JPanel();
List lst = new List(); //消息显示
JTextField txtIP = new JTextField(18); //填写IP地址
JTextField txtMSG = new JTextField(20); //填写发送消息
JLabel lblIP = new JLabel("IP地址:");
JLabel lblMSG = new JLabel("消息:");
JButton btnSend = new JButton("发送");
byte [] buf;
//定义DatagramSocket的对象必须进行异常处理
//发送和接收数据报包的套接字
DatagramSocket ds = null;
//=============构造函数=====================
public Chat()
{
CreateInterFace();
//注册消息框监听器
txtMSG.addActionListener(this);
btnSend.addActionListener(this);
try
{
//端口:9527
ds =new DatagramSocket(sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
//============接受消息============
//匿名类
new Thread(new Runnable()
{
public void run()
{
byte buf[] = new byte[1024];
//表示接受数据报包
while(true)
{
try
{
DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort);
ds.receive(dp);
lst.add("【消息来自】◆" + dp.getAddress().getHostAddress() + "◆"+"【说】:" + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0);
}
catch(Exception e)
{
if(ds.isClosed())
{
e.printStackTrace();
}
}
}
}
}).start();
//关闭窗体事件
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent w)
{
System.out.println("test");
int n=JOptionPane.showConfirmDialog(null,"是否要退出?","退出",JOptionPane.YES_NO_OPTION);
if(n==JOptionPane.YES_OPTION)
{
dispose();
System.exit(0);
ds.close();//关闭ds对象//关闭数据报套接字
}
}
});
}
//界面设计布局
public void CreateInterFace()
{
this.add(lst,BorderLayout.CENTER);
this.add(p,BorderLayout.SOUTH);
p.add(lblIP);
p.add(txtIP);
p.add(lblMSG);
p.add(txtMSG);
p.add(btnSend);
txtIP.setText(sendIP);
//背景颜色
lst.setBackground(Color.yellow);
//JAVA默认风格
this.setUndecorated(true);
this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
this.setSize(600,500);
this.setTitle("〓聊天室〓");
this.setResizable(false);//不能改变窗体大小
this.setLocationRelativeTo(null);//窗体居中
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setVisible(true);
txtMSG.requestFocus();//消息框得到焦点
}
//===============================Main函数===============================
public static void main(String[]args)
{
new Chat();
}
//================================发送消息===============================
//消息框回车发送消息事件
public void actionPerformed(ActionEvent e)
{
//得到文本内容
buf = txtMSG.getText().getBytes();
//判断消息框是否为空
if (txtMSG.getText().length()==0)
{
JOptionPane.showMessageDialog(null,"发送消息不能为空","提示",JOptionPane.WARNING_MESSAGE);
}
else{
try
{
InetAddress address = InetAddress.getByName(sendIP);
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
ds.send(dp);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
txtMSG.setText("");//清空消息框
//点发送按钮发送消息事件
if(e.getSource()==btnSend)
{
buf = txtMSG.getText().getBytes();
try
{
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort);
}
catch(Exception ex)
{
ex.printStackTrace();
}
txtMSG.setText("");//清空消息框
txtMSG.requestFocus();
}
}
}
Java中封装了大量的socket API 为编写网络通信程序提供了极大的方便 在计算机网络的学习中 大家都已熟练掌握了TCP/UDP的基本原理 在此不在赘述 仅给出接收端和发送端的源代码 供大家讨论学习 发送端代码如下:import java io *;import java lang *;import *;public class uclient{private DatagramSocket cli;private DatagramPacket pac;private byte *** [];private String sen;public uclient(){Init();}public void Init(){try{//指定端口号 避免与其他应用程序发生冲突cli=new DatagramSocket( ); *** =new byte[ ];sen= UDP方式发送数据 ; *** =sen getBytes();pac=new DatagramPacket( *** *** length InetAddress getByName( localhost ) );cli send(pac);}catch(SocketException se){se printStackTrace();}catch(IOException ie){ie printStackTrace();}}public static void main(String args[]){new uclient();}}接收端数据:import java io *;import java lang *;import *;public class userve{private DatagramSocket ser;private DatagramPacket pac;private byte rb[];private String rev;public userve(){Init();}public void Init(){try{ser=new DatagramSocket( );rb=new byte[ ];pac=new DatagramPacket(rb rb length);rev= ;int i= ;while(i== )//无数据 则循环{ser receive(pac);i=pac getLength();//接收数据if(i ){//指定接收到数据的长度 可使接收数据正常显示 开始时很容易忽略这一点rev=new String(rb pac getLength());System out println(rev);i= ;//循环接收}}}catch(Exception e){e printStackTrace();}}public static void main(String args[]){new userve();}} lishixinzhi/Article/program/Java/hx/201311/26023