java通信小总结

 

没有接触通信的时候觉得几台电脑之间通信很神秘,那么要实现通信一定很难。但是,从接触通信的一些基本的到现在可以实现基本的网络通信,并可以传输文件和实现网络画图板,觉得通信并没有自己想象的那么难。

通信主要是写出服务器和客户机,然后在知道对方IP的条件下,在指定的端口上建立连接,获得连接对象后,使用其出入输出流进行一字节为单位的数据传输。

 

一.编写服务器三步骤 
第一步:实例化一个服务器:SocketServer server=new SocketServer("端口"); 

第二步:等待服务器的连接client=server.recept(); 

第三步:实例化输入输出流 outputstream ous=client.getOutputstream();i

nputstream ous=client.getInputstream(); 
第四部:开始进入读取程序  

二.编写客户机的步骤 
第一步:实例化一个客户机Socket socket=new Socket(); 

第二步:实例化输入输出 流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream(); 

第三部:开始进入处理程序。

注意:

1----服务器在接入一个客户机之后要循环等待,需要放在死循环中。

2----服务器需要同时处理多个客户机 时,需要给每个客户机建立一个服务器线程

3----读取消息和发送消息时都应该和客户机定义好规则 ,并且都必须遵守次读写规则。

4----突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句.

package newtest;

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

/**
 * 创建服务器线程类,该类继承自Thread
 * @author Administrator
 *
 */
public class ServerThread extends Thread{

	private Socket client;//服务器连接对象
	private OutputStream out;//输出流对象
	private InputStream in;//输入流对象
	/**
	 * 构造方法,传入该线程要处理的连接对象
	 * @param lient:要处理的连接对象
	 */
	public ServerThread(Socket client){
		this.client=client;
	}
	/**
	 * 重写线程的Run方法
	 */
	public void run(){
		//处理连接的方法
		ProcessChat();
	}
	/**
	 * 处理连接的方法
	 */
	private void ProcessChat() {
		try {
			out=client.getOutputStream();//获得相应的输出流对象
			in=client.getInputStream();//获得相应的输入流对象
			SendMsg("欢迎来到服务器");
			String str="";
			str=Getmsg();
			while(!str.equals("bye")){
				System.out.println("client_say:"+str);
				SendMsg("服务器收到:"+str);
				str=Getmsg();
			}
			out.write(str.getBytes());
			client.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 从客户机获取信息的方法
	 * @return
	 * @throws IOException 
	 */
	private String Getmsg() throws IOException {
		StringBuffer srb=new StringBuffer();
		int i=in.read();
		while(i!=13){//当用户打出一个回车符时,表示一句话输入完毕
			srb.append((char)i);
			i=in.read();
		}
		return srb.toString().trim();//返回所对应的出去空格后的字符串
	}
	/**
	 * 向客户机发送信息的方法
	 * @param string:要发送的信息
	 */
	private void SendMsg(String str) {
		str=str+"\r\n";
		try {
			out.write(str.getBytes());
			out.flush();//强制输出
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
 

 package ChatForUI;

import java.awt.Color;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;


/**
 * 创建客户机线程类,该类继承自Thread类
 * @author Administrator
 *
 */
public class ClientThread extends Thread{
	private int port;//端口
	private Socket client;//连接对象
	private InputStream in;//输入信息流
	private OutputStream out;//输出信息流
	private DataInputStream dins;
	private DataOutputStream dout;
	private ClientUI cui;//客户机界面
	private Shape shape;//图形对象
	/**
	 * 构造方法
	 * @param cui 
	 * @param port:端口
	 */
	public ClientThread(int port, ClientUI cui){
		this.port=port;
		this.cui=cui;
		
		try {
			client=new Socket("localhost",port);//实例化客户端
			in=client.getInputStream();//得到对应的输入信息流对象
			out=client.getOutputStream();//得到对应的输出信息流对象
			//将输出输入流都包装为DataInputStream和DataOutputStream以方便读取原始数据类型
			dins=new DataInputStream(in);
			dout=new DataOutputStream(out);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 重写run方法
	 */
	public void run(){
		try {
		String str_msg="";
		int[] deawIf=new int[8];
		int[] FCdata=new int[5];
		while((!"bye".equals(str_msg))&&!(str_msg==null)){
			str_msg=GetMsg();
			if(str_msg.equals("验证失败")){
				cui.jta_showmsg.append("服务器已经断开\r\n");
				cui.jb_port.setText("连接");
				this.CloseTh();//关闭本线程
				return;
			}
		}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 接受信息的方法
	 * @throws IOException 
	 */
	protected String GetMsg(){
		try {
			String str = readmsg();			
			cui.jta_showmsg.append(str+"\r\n");
			return str;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 向对应的服务器发送信息的方法
	 * @param msg:要发送的信息
	 * @throws IOException 
	 */
	protected void SendMsg(String msg) throws IOException {
		msg=msg+"\r\n";
		dout.writeChars(msg);
		dout.flush();
		cui.jta_showmsg.append(msg);//将信息显示到显示信息的区域
		cui.jta_msg.setText(null);
	}
	/**
	 * 创建读取一行信息的方法
	 * @throws IOException :抛出IO异常
	 * @return:读到的一行字符串
	 */
	private String readmsg() throws IOException {
		StringBuffer srb=new StringBuffer();
		int i=dins.readChar();
		while(i!='\n'){//当用户打出一个回车符时,表示一句话输入完毕
			srb.append((char)i);
			i=dins.readChar();
		}
		return srb.toString().trim();//返回所对应的出去空格后的字符串
	}
	/**
	 * 关闭该线程的方法
	 */
	public void CloseTh() {
		try {
			client.close();
			this.stop();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
 

 

你可能感兴趣的:(java,socket)