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

网络编程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是Java网络编程中的核心组件,用于实现客户端和服务器之间的通信。在这个实践案例中,我们将深入探讨这两个类的使用以及如何构建一个简单的聊天应用。首先,我们需要理解Socket和ServerSocket的...

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

    在"PromiseSeventeen"这个文件中,可能包含了关于Java网络编程的实例代码,帮助你更好地理解Socket和ServerSocket的使用。你可以通过运行这些代码来实践网络通信的过程,加深对C/S模式的理解。 在实际应用中,Java...

    使用Socket,ServerSocket编程

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

    一个简单的socket/serversocket例子

    在Java编程语言中,Socket和ServerSocket是网络通信的核心组件,它们主要用于实现客户端与服务器之间的连接。本示例提供了一个基础的Socket/Serversocket应用程序,帮助开发者理解如何使用这两个类来构建基本的TCP...

    socket-ServerSocket例子

    在Java编程语言中,`Socket`和`ServerSocket`是用于网络通信的重要组件,它们构成了基于TCP协议的基础网络通信框架。下面将详细讲解这两个类及其在实际应用中的使用。 `ServerSocket`是Java中的服务器端套接字类,...

    Socket+ServerSocket代码

    Socket和ServerSocket是Java编程语言中的两个核心网络通信类,它们在实现客户端-服务器应用程序时起着关键作用。本文将深入探讨这两个类的功能、用法以及如何在实际项目中使用它们。 首先,让我们理解ServerSocket...

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

    本教程将聚焦于使用Java的Socket和ServerSocket类来构建一个基础的多人聊天室程序,这是TCP网络编程的一个经典应用。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,`...

    java网络编程socket编程等

    例如,构建一个简单的HTTP服务器,可以使用Socket和ServerSocket处理HTTP请求;设计一个即时通讯应用,可能需要用到TCP或UDP的Socket编程。 总之,Java网络编程与Socket编程是Java开发者必须掌握的技术之一。理解其...

    华农网络编程socket通信

    通过学习和实践“华农网络编程socket通信”课程,学生可以掌握网络通信的核心技术,为开发各种网络应用打下坚实基础。在实际项目中,理解并灵活运用Socket编程能够解决许多网络通信问题,提升系统的稳定性和效率。

    Java Socket网络编程.pdf

    在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...

    socket-serversocket

    Socket和ServerSocket是Java编程语言中用于网络通信的重要类,它们是Java的Socket API的核心组成部分。这个"socket-serversocket"资源可能包含了一系列的代码示例,帮助初学者理解如何在客户端和服务器之间建立连接...

    JAVA Socket 网络编程教程

    Java Socket网络编程是Java开发中一个重要...Java Socket编程是构建网络应用的基础,掌握其原理和实践方法对于开发分布式系统、网络服务等至关重要。通过不断实践和学习,开发者可以更熟练地运用Socket来解决实际问题。

    java网络编程socket可视化

    在本项目"java网络编程socket可视化"中,我们将探讨如何使用Java Socket API创建一个简单的服务器,以及与其交互的客户端应用,同时实现数据的可视化展示。 首先,我们需要理解Socket的工作原理。Socket是网络上的...

    java网络编程 socket

    通过阅读《Java网络编程文档教材》和《Java基础三步学会JavaSocket编程》,你可以更深入地了解Java Socket编程的细节和实践技巧。理论结合实践,才能真正掌握这一技术。在实际开发中,不断优化和调试,才能编写出...

    java网络编程 socket的TCP应用编程

    - Java Socket类和ServerSocket类是进行TCP网络编程的核心API。 - ServerSocket用于创建服务器端的套接字,监听特定端口的连接请求。 - Socket用于创建客户端的套接字,与服务器建立连接。 3. **服务端编程**: ...

    Socket编程实验报告.docx

    在这个实验报告中,我们主要探讨了如何使用Java的Socket和ServerSocket类进行TCP协议的客户端和服务器端编程。 实验目标是掌握Socket编程的基本方法,理解客户端与服务器端的区别,并熟练使用Socket类与...

    基于TCP的Socket&ServerSocket通讯

    在IT行业中,网络通信是至关重要的一个领域,特别是在分布式系统和互联网应用中。TCP(Transmission ...通过理解TCP协议的特性,以及熟练使用Java的Socket和ServerSocket类,开发者可以构建稳定、高效的网络应用。

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

    通过实验,我们掌握了网络编程的基本概念,如客户机、服务器、协议、端口等,并且了解了 Java.net 包中常用的网络编程工具类的功能和使用。 一、多线程编程 多线程编程是指在一个程序中使用多个线程来实现并发执行...

    c#网络编程 socket源代码

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而C#作为一种强大的面向对象的编程语言,提供了丰富的工具和库来支持网络通信。本文将深入探讨C#中的Socket网络编程,结合源代码实例,帮助你更好地理解和...

Global site tag (gtag.js) - Google Analytics