现在的位置: 首页 > 综合 > 正文

Socket编程

2013年10月11日 ⁄ 综合 ⁄ 共 3674字 ⁄ 字号 评论关闭

1.什么是Socket

  a. Socket的英文原意是"插座"

  b. 所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄

  c. 应用程序通常通过"套接字"向网络发送请求或者应答网络请求

2.Socket基本通讯模型

3.使用基于TCP协议的Socket

4.使用基于UPD协议的Socket

5.编写程序

 a.创建两个项目Client,Socket

 b.Client项目有两个文件TCPClient.java,UDPClient.java

   TCPClient.java中的代码如下:

package wei.cao.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			//创建一个Socket对象,指定服务端的IP地址和端口
			Socket socket=new Socket("192,168,1,104",4567);
			//使用InputStream读取硬盘上的文件
			InputStream inputStream=new FileInputStream("D://test.txt");
			//从Socket当中得到OutputStream
			OutputStream outputStream=socket.getOutputStream();
			byte buffer[]=new byte[4*1024];
			int temp=0;
			//将inputStream当中的数据取出,并写入到outputStream当中
			while((temp=inputStream.read(buffer))!=-1)
			{
				outputStream.write(buffer);
			}
			outputStream.flush();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

UDPClient.java中的代码如下:

package wei.cao.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     try {
    	 //首先创建一个DatagramSocket对象
		DatagramSocket socket=new DatagramSocket(4567);
		try {
			//创建InetAddress对象
			InetAddress  serverAddress=InetAddress.getByName("192.168.1.104");
			String str="Hello";
			byte data[]=str.getBytes();
			//创建一个DatagramPacket对象,并指定要讲这个 数据包发送到网络当中的哪个地址,以及端口号
			DatagramPacket packet=new DatagramPacket(data,data.length,serverAddress,4567);
		    try {
		    //调用Socket对象的send方法,发送数据
				socket.send(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	} catch (SocketException e) {
		e.printStackTrace();
	}
	}

}

c.Socket项目中有一个SocketActivity.java文件,代码如下

package wei.cao.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SocketActivity extends Activity {
    /** Called when the activity is first created. */
	private Button btnStartSocket;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStartSocket=(Button)this.findViewById(R.id.btnStartSocket);
        btnStartSocket.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				new ServerThread().start();
				
			}
		});
        
    }
    class ServerThread extends Thread
    {
    	//基于TCP的
		public void run() {
			//声明一个ServerSocket对象
			ServerSocket serverSocket=null;
	    	try {
	    		//创建一个ServerSocket对象,并让Socket在4567端口监听
				serverSocket=new ServerSocket(4567);
				//调用serverSocket的accept()方法,接收客户端所发送的请求(阻塞的方法,如果客户端没有发送请求,就不会向下运行)
				Socket socket=serverSocket.accept();
				//从Socket当中得到InputStream对象
				InputStream inputStream=socket.getInputStream();
				byte buffer[]=new byte[1024*4];
				int temp=0;
				//从inputStream当中读取客户端所发送的数据
				while((temp=inputStream.read(buffer))!=-1)
				{
					System.out.print(new String(buffer,0,temp));
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally
			{
				try {
					serverSocket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
	    	   
		}
       //基于UDP的
		public void run2()
		{
			try {
				//创建一个DatagramSocket对象,并指定监听的端口号
				DatagramSocket socket=new DatagramSocket(4567);
				byte data[]=new byte[1024];
				//创建一个空的DatagramPacket对象
				DatagramPacket packet=new DatagramPacket(data,data.length);
				try {
				//用receive方法接收客户端所发送 的数据
					socket.receive(packet);
					System.out.println(packet.getLength());
				} catch (IOException e) {
					e.printStackTrace();
				}
			} catch (SocketException e) {
	
				e.printStackTrace();
			}
			
			
		}
    }
}

 

抱歉!评论已关闭.