网络编程-局域网通信

29 篇文章 0 订阅
6 篇文章 0 订阅
网络编程的定义


使用代码来完成,两个或者多个应用程序,之间的通过某种协议进行数据传递,这就是网络编程。



4、开发一个服务端和一个客户端的程序,让后让客户端来链接服务端,并且进行数据传输。


5、基于Socket 完成一个网络编程实例.




  a、创建服务端(ServerSocket(创建端口)), 创建一个客户端(Socket,必须指明要链接服务端ip,和port(端口))


  b、服务端要给客户端发送一个信息,客户端要接受服务端发送过来的信息,


     客户端还要给服务端发送信息,服务端也得接受客户端发送的信息。


  c、能不能就这样不断发送信息?


  d、服务能不能给多个客户端发送信息?能不能监听到多个客户端?




6、服务负责接受任何一个客户端发送来信息,并且把发送来的信息分发给每个客户端。




7、作业:指定给谁发信息。




gh.li@hyserver.com


客户端代码

package com.salmon.test;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestClient extends Frame{
	// 客户端链接对象
	Socket  s = null;
	// 创建输出流  负责窗口给 服务端发送信息
	DataOutputStream   dos;
	//  声明单行的文本框 组件
	TextField   tf;
	//  多行文本框组件
	TextArea    ta;
	

	public  void init(){
		// 设置位置 
		this.setLocation(0, 0);
		// 设置大小
		this.setSize(400,300);
		//  设置当前窗口的大小
		//this.setBounds(0, 0, 400, 300);
		//  创建组件
		tf = new  TextField();
		ta = new  TextArea();
		// 把创建好的组件 放在我们当前窗口中
	    this.add(ta,BorderLayout.NORTH);
	    this.add(tf,BorderLayout.SOUTH);
		// 给窗口添加一个关闭的时间
		this.addWindowListener(new WindowAdapter() {

			//  这个就会在你 点击窗口 那个红色叉号   就会调用这个方法   就去把当前的程序结束
			@Override
			public void windowClosing(WindowEvent arg0) {
				//  退出程序
				System.exit(0);
			}
			
		});
		//  给单行文本框添加回车触发事件
		tf.addActionListener(new ActionListener() {
			
			/**
			 * 在你按  回车的时候 就调用这个方法  
			 */
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				// 获得单行输入框中值   
				String msg = tf.getText();
				Date today = new  Date();
				SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
				String time = sdf.format(today);
				msg = time+":\n"+msg;
				// 先把信息发送给服务端
				try {
					dos.writeUTF(msg);
					dos.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}
				/*// 把放在  多行文本框中
				if("".equals(ta.getText())){
					ta.setText(msg);
				}else{
					ta.setText(ta.getText()+"\n"+msg);
				}*/
				tf.setText("");
			}
		});
		//  调用创建链接 方法
		this.createConn();
		// 启动一个线程负责 接收服务端发送过来信息
		ServerThread  st = new  ServerThread(s,ta);
		st.start();
		//  窗口随着内容大小而呈现(自适应)
	    this.pack();
		/*//  让窗口中组件重新布局
		this.validate();
		//  让窗口显示
		this.show();*/
	    // 显示窗口
	    this.setVisible(true);
		
	}
	/**
	 * 创建和服务器的链接
	 */
	public void   createConn(){
		try {
			 s  = new Socket("localhost",8000);
			 // 获得一个 输出流对象
			 dos =new DataOutputStream(s.getOutputStream());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public  static  void   main(String args[]){
		new TestClient().init();
	}
}
//  一个文件 两个类
class  ServerThread  extends Thread{
	Socket   s;
	DataInputStream  dis;
	TextArea  ta;
	public  ServerThread(Socket s,TextArea ta){
		this.ta = ta;
		this.s = s;
		try {
			dis = new  DataInputStream(s.getInputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public  void run(){
			try {
				while (true) {
					String msg = dis.readUTF();
					if("".equals(ta.getText())){
						ta.setText(msg);
					}else{
						ta.setText(ta.getText()+"\n"+msg);
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}

服务端代码

package com.salmon.test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class TestServer {
	
	boolean flag = true;
	
	List  list  = new  ArrayList();

	public  void  init(){
		try {
			// 创建服务端对象
			ServerSocket  ss = new  ServerSocket(8000);//1-1023  系统中就已经占用了
			while(flag){
				// 启动服务的监听   去监听有没有客户端  链接
				Socket  s = ss.accept();
				System.out.println("成功监听到一个客户端的链接.....");
				// 就创建一个 线程对象  来封装这个客户端对象
				ClientThread   ct = new  ClientThread(s,list);
				ct.setName(s.getPort()+"");
				// 装到一个容器中
				list.add(ct);
				// 启动线程
				ct.start();
				
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new  TestServer().init();
	}

}
//  一个源文件   两个类
class  ClientThread  extends Thread{
	List list;
	Socket  s;
	DataInputStream  dis;
	DataOutputStream dos;
	public ClientThread(Socket s,List list){
		this.list = list;
		this.s = s;
		try {
			dis = new  DataInputStream(s.getInputStream());
			dos = new  DataOutputStream(s.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public  void  run(){
		// 接受信息   并且把接受信息发送给所有人
		while(true){
			try {
				String  msg = dis.readUTF();
				for (int i = 0; i < list.size(); i++) {
					ClientThread ct = (ClientThread)list.get(i);
					ct.dos.writeUTF(this.getName()+"--"+msg);
					ct.dos.flush();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
}


  
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值