String.getBytes();方法可以转化为一个byte数组。即byte[] =s.getBytes();
网络技术编程
一、客户端编程步骤
1、 建立网络连接。需要制定连接到的服务器的IP地址和端口号。
2、 交换数据。客户端发送一个请求,服务器响应一个请求。
3、 关闭网络。交换完数据之后,关闭网络连接,释放端口号,内存等资源。
二、服务器端网络编程步骤。
1、 监听端口。服务器端属于被动等待连接,不需要发起连接,只需要监听本地计算机的某个端口即可。
2、 获得连接。客户端连接到服务器端时,就可以获得一个连接。这个连接包括客户端IP地址等信息。获得连接时,需要开启专门的线程处理该连接。每个连接都由一个独立的线程实现。
3、 交换数据。
4、 关闭连接。
TCP编程时java.net.Socket代表客户端连接。Java.net.ServerSocket类代表服务器端连接。
所以创建客户端连接就是创建Socket对象。
例如:Socket socket= new Socket(“192.168.1.1”,10000);
一旦建立连接,我们进行数据传输使用JAVA io流实现。
OutputStreamos=socket.getOutputStream();获得输出流。
InputStreamis=socket.getInputStream(); 获得输入流。
先向输出流中写入数据,这些数据会被系统发送出去。然后输入流读取服务器端的反馈信息。
os.write(data);发送数据。
Is.read();输出反馈数据.
服务器端,ServerSocket serversocket=newServerSocket(10000);监听,当有客户端连接到达时,需要建立对应的socket对象, Socket s=serversocket.accept():获得连接。
UDP编程
首先介绍一个基础的网络类,InetAddress类,该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。用getHostName()方法可以获取本地的域名和IP地址。getByName();方法,可以使用域名、IP地址创建对象,getLocalHost()获取本机地址对象,getHostAddress()获取存在inetAddress中的IP地址。
InetAddressinet=InetAddress.getLocalHost();获得本机地址对象。
UDP(userDatagram Protocol)用户数据报协议,在JAVA API 中,实现UDP编程的方式,包含客户端编程和服务器网络边恒分别是DatagramSocket和DatagramPacket;
DatagramSocket类实现网络连接,包括客户端和服务器端网络连接。它实现的就是发送数据时的发射器,以及接受数据时的监听器的角色。
DatagramPocket实现的对于网络中传输的数据封装。该对象代表网络中交换的数据。在UDP编程中,无法发送的数据还是接受的数据都需要被处理成DatagramPacket对象,其中包含发送到的地址、发送到的端口以及发送的内容。
在客户端的建立连接不需要指定IP地址和端口号,DatagramSocket ds=new DatagramSocket();当然也可以指定连接使用的端口号。UDP编程中IO技术不是必须的。在发送数据时,需要将发送的数据转换为byte数组,然后将发送的内容,服务器ip和端口号一起构成一个DatagramPacket类型对象,这样数据的准备就完成了。
DatagramPacket中的getAddress()获得其数据包中的ip地址,getPort()获得端口号,getData()获得数据,getLength获得数据长度。getAddress获得的ip地址需要赋值给InetAddress对象,然后用它的getHostAddress()方法吧ip地址解析出来。
说明:DatagramPacketdp=new DatagramPacket(data, data.length, addrdss, serverport);
第一个参数是byte数组类型数据,第二参数是长度,第三参数是InetAddress对象获得的ip地址,第四就是端口号;第三参数创建可用ip地址直接创建;
更新于2015-5-13
这段时间用到了UDP编程,也算学习了下UDP编程。我是做的一个测试,一个服务器端在电脑上运行,客户端是一个安卓程序,用来发送消息到服务器端。
代码我就直接贴出。
接收端:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; /** * @author FZY E-mail:[email protected] * @version 创建时间:2015-5-12 下午5:09:02 * 类说明 UDP实现的客户端,用来接收数据,并显示出来 */ public class Client { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Myrunnable myrunnable = new Myrunnable(); Thread thread = new Thread(myrunnable); thread.start(); } public static class Myrunnable implements Runnable { @SuppressWarnings("resource") @Override public void run() { // TODO Auto-generated method stub try { DatagramSocket ds = new DatagramSocket(); byte[] buf = new byte[1024]; DatagramPacket dp = null; ds = new DatagramSocket(6789); dp = new DatagramPacket(buf, 1024); System.out.println("receive data========"); while (true) { ds.receive(dp);//接收数据 String string = new String(dp.getData(), 0, dp.getLength()) + "from" + dp.getAddress().getHostAddress() + ":" + dp.getPort();//此处是把接收到的数据转为字符串,并且组合发送过来的地址和端口。 System.out.println(string); ds.close(); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }Android发送端,界面就一个按钮,每点击就会发送一个Hello world!
package com.example.udpserver; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class UdpserverActivity extends Activity { private Button button; DatagramSocket ds = null; DatagramPacket dp = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.udpserver); button = (Button) this.findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub MyRunn myRunn = new MyRunn(); new Thread(myRunn).start(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.udpserver, menu); return true; } public class MyRunn implements Runnable { @Override public void run() { // TODO Auto-generated method stub try { ds = new DatagramSocket(3000); // 服务器端在3000端口监听 String string = "Hello world!!!"; dp = new DatagramPacket(string.getBytes(), string.length(), InetAddress.getByName("172.18.144.135"), 6789);// 服务器端向9000端口发送数据 System.out.println("发送信息========"); ds.send(dp); ds.close(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }