`
百合不是茶
  • 浏览: 345611 次
社区版块
存档分类
最新评论

网络编程Socket和ServerSocket简单的使用

阅读更多

 

网络编程;TCP/IP协议

 

网络:实现计算机之间的信息共享,数据资源的交换

 

协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去

 

端口:用于计算机之间的通信

     每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识

0~65535

 

查看被使用的端口

在命令行运行netstat -ano

 

C/S模式:客户端和服务器共同承担计算机的体系结构

   优点;a,分别负责不同的工作,快速的进行数据的传递

        b,服务器可同时为数千台的客户端进行服务

c,多个客户端可以同时访问该服务器

 

  IP    终端设备在网络中的唯一编号

查看IP

在命令行运行ipconfig

 

本机Ip的表示方式:localhost    127.0.0.1  

 

万维网  公网

局域网  内网

 

 

IP地址:分为A,B,C,D四类,每个IP地址分为四个8位字节

A类:1.0.0.0到127.0.0.0

B类:128.0.0.0到 191.255.0.0

C类;192.0.0.0到 223.255.255.0

D类;224.0.0.0到 254.0.0.0

 

 

DNS;域名   将IP地址转化为一个标识

 

 

InetAddress:封装IP地址和端口

 

 

 

Socket

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

 

常用:

 

构造方法摘要
  Socket() 
通过系统默认类型的 SocketImpl 创建未连接套接字
  Socket(InetAddress address, int port) 
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 

 

 

方法摘要

 

InetAddress getInetAddress() 
返回套接字连接的地址。
InputStream getInputStream() 
返回此套接字的输入流。

 

 

InetAddress getLocalAddress() 
获取套接字绑定的本地地址。

 

 

OutputStream getOutputStream() 
返回此套接字的输出流。

 

 

 

java.net 
类 ServerSocket

 

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

 

构造方法摘要

 

ServerSocket(int port) 
创建绑定到特定端口的服务器套接字。

 

 

 

方法摘要

 

 

Socket accept() 
侦听并接受到此套接字的连接。

 

InetAddress getInetAddress() 
返回此服务器套接字的本地地址。

 

使用InetAddress来测试

 

 

package com.network.com;

import java.net.Inet4Address;
import java.net.InetAddress;

public class InetAddressDemo {

	public static void main(String[] args) {

		 try {
			 //获得本机的地址
			 InetAddress LocalHost=	InetAddress.getLocalHost();
			 System.out.println(LocalHost);
			 //根据机器名获得相应的主机名
			 InetAddress name=	InetAddress.getByName("127.0.0.1");
			 System.out.println(name);
			 //通过域名获得主机名
			 InetAddress name1=	InetAddress.getByName("www.baidu.com");
			 System.out.println(name1);
			 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 运行结果:

 

 

baihe/192.168.43.229

/127.0.0.1

www.baidu.com/61.135.169.105

 

 

显示群聊的

 

package 聊天Server;
/**
 * 服务器界面
 */
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class SreverDemo {

	public static ArrayList<Socket> list = new ArrayList<Socket>();

	public static void main(String[] args) {

		try {
			// 创建服务器套接字
			ServerSocket server = new ServerSocket(6060);
			System.out.println("等待链接:");
			while(true){
			// 等待客户端的链接
			Socket socket = server.accept();
			// 输出连接到的ip和端口
			System.out.println("连接上" + socket.getLocalSocketAddress()
					+ socket.getRemoteSocketAddress());

			//创建线程对象
			SreverDemoThread thread = new SreverDemoThread(socket);
			//启动线程
			thread.start();
			list.add(socket);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

package 聊天Server;

/**
 * 服务器线程的输入输出
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;

public class SreverDemoThread extends Thread {

	private Socket socket;

	public SreverDemoThread(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 从Socket上获得输出流对象
			OutputStream out = socket.getOutputStream();

			// 包装成字符输出流
			OutputStreamWriter writer = new OutputStreamWriter(out);

			// 包装成缓冲字符输出流
			BufferedWriter bis = new BufferedWriter(writer);

			bis.write(socket.getRemoteSocketAddress() + "等待输出:" + "\r\n");
			bis.flush();

			// 获得输入流
			InputStream isr = socket.getInputStream();
			// 包装成字符输入流
			InputStreamReader reader = new InputStreamReader(isr);
			// 包装成缓冲字符流
			BufferedReader read = new BufferedReader(reader);
			// 每次读取一行
			String str = read.readLine();
			while (str != null) {
				System.out.println("说:" + str);
				// 遍历队列
				for (int i = 0; i < SreverDemo.list.size(); i++) {
					// 取出队列中的个数
					Socket sc = SreverDemo.list.get(i);
					if (sc != socket) {
						// 输出给其它的客户端,先获得该客户端上的套接字
						OutputStream ptm = sc.getOutputStream();
						// 包装成缓冲字符串
						BufferedWriter bw = new BufferedWriter(
								new OutputStreamWriter(ptm));
						// 输出
						bw.write(str + "\r\n");
						System.out.println(socket.getRemoteSocketAddress()
								+ "输出:" + str);
						bw.flush();
					}
				}
				str = read.readLine();
			}
		} catch (Exception e) {
			System.out.println(socket.getRemoteSocketAddress() + ":客户端已经退出");
		}

	}

}

 

 

 

 

客户端

 

package qqclient;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * 客户端界面
 * 
 * @author Administrator
 * 
 */
public class ChatclientUI extends JFrame {
	// 属性
	private JTextArea areaSend;
	private BufferedWriter bw;
	private BufferedReader br;
	private JTextArea area;
	private InetAddress name;

	// 主函数
	public static void main(String[] args) {
		new ChatclientUI();
	}

	// 构造方法
	public ChatclientUI() {
		intitUI();
		Send();
		ChatClientThread th = new ChatClientThread(br, area);
		th.start();
	}

	// 创建界面的方法
	public void intitUI() {
		this.setTitle("聊天室");
		this.setSize(500, 400);
		// 设置关闭方式
		this.setDefaultCloseOperation(3);
		// 设置布局
		this.setLayout(new FlowLayout());
		// 禁止改变大小
		this.setResizable(false);

		// 消息区域
		// 设置多行文本

		area = new JTextArea();
		area.setPreferredSize(new Dimension(480, 200));
		// 设置背景颜色
		area.setBackground(Color.lightGray);
		// 设置字体颜色
		area.setForeground(Color.green);
		JScrollPane pallSend = new JScrollPane(area);
		// 设置自动滚动
		pallSend.setAutoscrolls(true);

		this.add(pallSend);

		// 消息发送区域
		areaSend = new JTextArea();
		areaSend.setPreferredSize(new Dimension(480, 100));
		// 设置字体颜色
		areaSend.setForeground(Color.blue);
		// 设置滚动区域
		JScrollPane sendPall = new JScrollPane(areaSend);
		this.add(sendPall);

		// 设置按钮
		JButton btn = new JButton("发送");
		this.add(btn);
		LisAction lis = new LisAction();
		btn.addActionListener(lis);

		// 设置窗体显示
		this.setVisible(true);
	}

	/**
	 * 创建客户端输入输出的方法
	 */
	public void Send() {
		try {
			// 创建客户端
			Socket socket = new Socket("127.0.0.1", 6060);

			name = socket.getInetAddress().getLocalHost();
			// 输入输出
			InputStream isr = socket.getInputStream();
			OutputStream ops = socket.getOutputStream();

			// 包装成缓冲输入输出流
			br = new BufferedReader(new InputStreamReader(isr));
			bw = new BufferedWriter(new OutputStreamWriter(ops));

		} catch (Exception e) {
			System.out.println(name + "未连接上服务器");
		}
	}

	// 创建监听器
	class LisAction implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String mm = areaSend.getText().trim() + "\r\n";
			if ("".equals(mm) || " ".equals(mm)) {

			} else {
				try {
					// 将字符串写出
					bw.write(name + ": " + getTime() + "\r\n" + mm);
					bw.flush();
					// 清空
					areaSend.setText("");

					// 显示在消息区域
					area.append(name + ": " + getTime() + "\r\n" + mm);

				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

		}

	}

	// 获得当前时间的方法
	public String getTime() {
		long time = System.currentTimeMillis();
		Date date = new Date(time);
		SimpleDateFormat ailm = new SimpleDateFormat("y/M/d  HH:mm:ss");
		return ailm.format(date);
	}

}

 

 

 

package qqclient;
import java.io.BufferedReader;
import java.io.IOException;
import javax.swing.JTextArea;

/**
 * 创建客户端线程读取	
 * @author Administrator
 *
 */

public class ChatClientThread  extends Thread{
	private BufferedReader br;
	private JTextArea area;
	private boolean islive = true;
	
	public  ChatClientThread(BufferedReader br,JTextArea area){
		this.br = br;
		this.area = area;
	}
	
	@Override
	public void run() {
		while(islive){
			try {
				String mm = br.readLine();
				area.append(mm+"\r\n");
			} catch (IOException e) {
				area.append("服务器连接失败"+"\r\n");
				e.printStackTrace();
			}
		}
		
	}
}

 

 

 

0
0
分享到:
评论

相关推荐

    Socket与ServerSocket编程实践聊天

    Socket与ServerSocket编程实践聊天,服务器和客户端频繁通信

    使用Socket,ServerSocket编程

    Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建 立基于UDP协议的网络通信

    使用Socket和ServerSocket实现多人聊天的聊天室程序

    基于TCP的网络编程,使用Socket和ServerSocket实现多人聊天的聊天室程序,Java网络编程章节训练的小程序

    一个简单的socket/serversocket例子

    只是简单的一个socket/serversocket编程例子

    学习JAVA—网络编程之Socket、ServerSocket、C/S模式

    只要配合这我的博客中的代码演示~平常忘了的话可以下载下来看看~反正也不要积分~下载也不会怀孕~哈

    网络编程 socket关键字

    Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //第二步,绑定 //二.1,获取本机的IP地址 IPAddress[] address = Dns.GetHostAddresses(Dns.Get...

    有关java线程循环和serversocket和socket的程序借鉴.pdf

    有关java线程循环和serversocket和socket的程序借鉴.pdf

    三步学会Java Socket编程

    ServerSocket用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等 的,并没有差别,不因为在...

    socket编程(源码)

    本资料提供的是用Socket编程实现聊天程序。 有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,...

    Java 网络编程 大全

    Java网络编程 Socket URL ServerSocket 等内容。并有相关的实例加以辅佐。

    JAVA网络编程

    Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 三步学会Java Socket编程(二) .doc Java基础 三步学会Java Socket编程(三).doc

    字符界面下的快捷方式

    Made by ytmfdw open.exe是一款Windows字符界面(命令提示符)下打开各种应用程序的小程序 相当于字符界面的快捷方式 原理: 读取 "C:\path.ini" 文件里的设置, ...使用前,请在C盘根路径下,创建path.ini文件

    java之socket编程简单实例

    一个用Socket和ServerSocket请求资源的例子

    java实现socket网络编程

    java实现socket网络编程 服务端使用ServerSocket绑定IP和端口,使用Accept监听端口是否有客户端发送连接请求,一旦有客户端发送连接请求, 服务端就回送连接信息,正式建立连接。Server端和Client端都可以通过Send,...

    Socket编程之TCP-UDP

    编程开发,适合初学者学习Socket编程的Tcp和Udp协议的Demo

    java网络编程精讲

    Java网络编程精讲,主要涉及Socket,ServerSocket,NIO,http协议,tcp,udp精讲等等

    Java网络Socket编程

    Socket的概念: ...iii. Java.net包中定义了两个类Socket和ServerSocket,分别用来实现双向连接的client和server端 iv. 建立组件连接时所需要的寻址信息为远程计算机的IP地址和端口号(Port number)

    [Java]详解Socket和ServerSocket学习笔记

    即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求,这会,Socket对于我们来说就非常实用了。本篇文章主要介绍了Socket和ServerSocket,有兴趣的可以了解一下。

    tcp/udp socket编程

    基于TCP协议的Socket编程 ① 创建TCP服务端步骤: a) 创建一个ServerSocket对象 b) 调用accept()方法接受客户端请求 c) 从Socket中获取I/O流 d) 对I/O流进行读写操作,完成与客户端的交互 e) 关闭I/O流和...

    java网络编程客户端和服务端

    适合java初学者,可以帮助你们了解简单的图形化界面,和网络编程

Global site tag (gtag.js) - Google Analytics