[置顶] 学习笔记---网络编程

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();
			}

		}

	}

}




你可能感兴趣的:(程序员,CSDN博客)