- 浏览: 599382 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
原理
socket的类型:
TCP:流式socket,SOCK_STREAM
可靠、双向、面向字节流
UDP:数据报式socket, SOCK_DGRAM
相关的系统调用:
socket(): 创建一个新的socket
bind():绑定于一个套接字地址上
listen(): 监听套接字
accept(): 接收连接请求
connect(): 发起连接请求
close(): 关闭连接
read()和write(): recv(), send(), recvfrom(), sendto()
1.TCP通信
server
client
2.UDP通信
server
client
3.聊天
server
client
socket的类型:
TCP:流式socket,SOCK_STREAM
可靠、双向、面向字节流
UDP:数据报式socket, SOCK_DGRAM
相关的系统调用:
socket(): 创建一个新的socket
bind():绑定于一个套接字地址上
listen(): 监听套接字
accept(): 接收连接请求
connect(): 发起连接请求
close(): 关闭连接
read()和write(): recv(), send(), recvfrom(), sendto()
1.TCP通信
server
package com.socket; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class SocketServer{ private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; //显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;//用于设置area_showWindow可拖拉的大小 //初始化 public SocketServer() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("发送"); dimension = new Dimension(50, 300); } //调用方法显示窗口 public void showFrame(){ initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } //主窗体 public void initFrame(){ frame.setTitle("服务端"); int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } //内容显示文本框和输入内容文本框 private void initChatTextArea(){ //取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); //将显示文本域设置为不可编辑 area_showWindow.setEditable(false); //设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } //发送文件,发送内容按钮 public void initButton(){ pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send(){ btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("服务端:"+info+"\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } private void socket(){ ServerSocket ss; try { ss = new ServerSocket(9988); //等待连接 客户端 Socket s=ss.accept(); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); //PrintWriter必须和socket有密切的关系 把写入的数据传到socket对应的OutputStream中 pw=new PrintWriter(s.getOutputStream(),true); //读取从客户端法发来的信息 while(true) { //读取从客户端发来的信息 String info=br.readLine(); //在文本栏里显示 area_showWindow.append("客户端:"+info+"\r\n"); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { SocketServer chat = new SocketServer(); chat.showFrame(); } }
client
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class Test { private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; // 显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;// 用于设置area_showWindow可拖拉的大小 // 初始化 public Test() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("发送"); dimension = new Dimension(50, 300); } // 调用方法显示窗口 public void showFrame() { initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } // 主窗体 public void initFrame() { frame.setTitle("客户端"); int width = (int) Toolkit.getDefaultToolkit().getScreenSize() .getWidth(); int height = (int) Toolkit.getDefaultToolkit().getScreenSize() .getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } // 内容显示文本框和输入内容文本框 private void initChatTextArea() { // 取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); // 将显示文本域设置为不可编辑 area_showWindow.setEditable(false); // 设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } // 发送文件,发送内容按钮 public void initButton() { pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send() { btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("客户端: " + info + "\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } //处理消息 @SuppressWarnings("all") private void socket() { try { Socket socket = new Socket("127.0.0.1", 9988); InputStreamReader isr = new InputStreamReader(socket.getInputStream()); BufferedReader br = new BufferedReader(isr); //PrintWriter必须和socket有密切的关系 pw = new PrintWriter(socket.getOutputStream(), true); while (true) { // 不停地读取从服务器端发来的信息 String info = br.readLine(); area_showWindow.append("服务端: " + info + "\r\n"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Test chat = new Test(); chat.showFrame(); } }
2.UDP通信
server
package com.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class SocketServer { public static void main(String[] args) { //TCP通信 // ServerSocket serverSocket = null ; // try { // serverSocket = new ServerSocket(3000); // Socket socket = serverSocket.accept(); // InputStream inputStream = socket.getInputStream(); // byte[] byt = new byte[1024]; // int length = 0; // // 开始读取 // while ((length = inputStream.read(byt)) != -1) { // System.out.println(new String(byt,0,length)); // } // } catch (Exception e) { // } //UDP通信 try { DatagramSocket serverSocket = new DatagramSocket(3000); byte[] byt = new byte[1024]; DatagramPacket packet = new DatagramPacket(byt, byt.length); serverSocket.receive(packet); System.out.println(new String(packet.getData())); serverSocket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
client
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Test { public static void main(String[] args) { // Socket socket = null ; // try { // socket = new Socket("192.168.1.192", 3000); // OutputStream outputStream = socket.getOutputStream(); // InputStream inputStream = new FileInputStream("D:123.txt"); // byte[] byt = new byte[1024]; // int length = 0; // // 开始读取 // while ((length = inputStream.read(byt)) != -1) { // outputStream.write(byt,0,length); // } // inputStream.close(); // } catch (Exception e) { // } try { DatagramSocket socketClient = new DatagramSocket(3001); InetAddress address = InetAddress.getByName("192.168.1.192"); byte[] content = "Just test".getBytes(); DatagramPacket packet = new DatagramPacket(content, content.length,address,3000); socketClient.send(packet); socketClient.close(); } catch (Exception e) { e.printStackTrace(); } } }
3.聊天
server
package com.socket; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * @author: * @TODO:Socket服务端 */ public class SocketServer { public static void main(String[] args) { // TCP通信 ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(3000); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); byte[] byt = new byte[1024]; int length = 0; // 开始读取 while ((length = inputStream.read(byt)) != -1) { System.out.println(new String(byt, 0, length)); } } catch (Exception e) { } // UDP通信 // try { // DatagramSocket serverSocket = new DatagramSocket(3000); // byte[] byt = new byte[1024]; // DatagramPacket packet = new DatagramPacket(byt, byt.length); // serverSocket.receive(packet); // System.out.println(new String(packet.getData())); // serverSocket.close(); // } catch (SocketException e) { // e.printStackTrace(); // } catch (IOException e) { // e.printStackTrace(); // } } }
client
import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Test { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; Scanner scanner = new Scanner(System.in); String content = ""; try { socket = new Socket("192.168.1.192", 3000); while (!(content = scanner.nextLine()).equals("exit")) { OutputStream outputStream = socket.getOutputStream(); inputStream = new ByteArrayInputStream(content.getBytes()); byte[] byt = new byte[1024]; int length = 0; // 开始读取 while ((length = inputStream.read(byt)) != -1) { outputStream.write(byt, 0, length); } } scanner.close(); inputStream.close(); } catch (Exception e) { } // try { // DatagramSocket socketClient = new DatagramSocket(3001); // InetAddress address = InetAddress.getByName("192.168.1.192"); // byte[] content = "Just test".getBytes(); // DatagramPacket packet = new DatagramPacket(content, // content.length,address,3000); // socketClient.send(packet); // socketClient.close(); // } catch (Exception e) { // e.printStackTrace(); // } } }
发表评论
文章已被作者锁定,不允许评论。
-
java WeakHashMap学习(key是弱引用)
2018-06-21 09:31 1232在Java集合中有一种特殊的Map类型:WeakHashMap ... -
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 953java为数据结构中的映射定义了一个接口java.util.M ... -
html pre标签使用(保留空格和回车等操作)
2018-05-15 08:37 2442pre 元素可定义预格式化的文本。被包围在 pre 元素中的文 ... -
java RESTful 详解
2018-04-27 11:35 643(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 990server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1704在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 480/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1621REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
缓存穿透(预设值防止多个进程读取数据库)、缓存并发、缓存失效(过期时间用随机数)学习
2018-02-22 14:25 434一、缓存穿透 我们在项 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11741.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1617如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 654传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4951.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2453MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
web http协议学习
2017-11-15 15:15 514HTTP协议是web开发必须掌握的协议之一,文章的内容并没有按 ... -
java Guava ListenableFuture实现线程回调功能
2017-11-14 10:17 1775java Future具有局限性。在实际应用中,当需要下 ... -
java Curator实现分布式锁
2017-09-05 14:39 1090Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 432import java.util.Iterator ... -
spring boot进行mybatis和JPA的整合
2017-08-30 10:12 4683初识spring boot Spring框架功能很强大,但是就 ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 673CyclicBarrier允许一组线程相互等待达到一个公共的障 ...
相关推荐
总的来说,Java Socket网络编程是构建网络应用的基础,无论是简单的文件传输、聊天应用,还是复杂的分布式系统,都离不开Socket的使用。通过理解和实践TCP和UDP的Socket编程,开发者能够更好地掌握网络通信的核心...
Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...
Java Socket 是一种网络通信协议,它是Java编程语言中实现客户端-服务器模型的基础。Socket 提供了低级别的、面向连接的、双向通信的网络接口,允许应用程序通过网络进行数据传输。在本示例中,我们将深入探讨Java ...
一个简单的聊天室系统就是一个使用Java Socket实现的典型例子,服务器端接收多个客户端的连接请求,每个客户端都可以发送消息给其他所有在线的客户端。 十、总结 Java Socket编程是构建网络应用的基础,掌握其原理...
实现Java Socket聊天多线程编程,图形化界面,多人聊天(群聊),私人聊天,是基于本地模拟的Java聊天程序。 Java Socket聊天程序是我用了三天的时间写出来,用Netbeans建的工程,图形化界面是Netbeans拖拉出来的,...
Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,主要利用了Socket编程接口来创建客户端和服务器端的连接,从而实现数据的双向传输。在这个系统中,用户可以通过客户端发送消息,服务器端接收到消息后...
总的来说,这个Java Socket聊天室项目是一个实用的学习资源,它涵盖了网络编程、多线程、GUI设计等多个Java核心技术,对于学习和理解Java网络编程非常有帮助。通过实际运行和修改代码,开发者可以深入理解网络通信的...
Java Socket聊天室是一种基于Java网络编程技术实现的通信系统,主要使用了Socket接口来构建客户端与服务器端的连接。在这个项目中,用户通过控制台(console)进行交互,体验类似于简单的在线聊天室。以下是对这个Java...
本项目“基于Java Socket网络编程实现的五子棋游戏,可多人在线玩耍,聊天”正是这种技术的实际应用。 首先,我们来深入理解Java Socket编程。Socket是网络通信中的端点,它允许两台计算机(或者网络上的任何其他...
Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、...而本示例中的简单QQ聊天程序,主要是为了演示Java Socket的基本使用和并发处理,帮助初学者理解网络编程的基本概念和操作流程。
总的来说,Java Socket聊天系统结合了网络编程、多线程、文件传输等多个重要概念和技术。理解并掌握这些知识点,不仅可以构建出功能丰富的聊天应用,也为其他类型的网络服务奠定了基础。在实践中,我们需要不断优化...
总的来说,这个"Java socket聊天室+窗口抖动"项目涵盖了Java网络编程、多线程、用户界面设计等多个方面,是学习和实践Java技术的好素材。通过这个项目,开发者不仅可以深入了解Socket通信,还能提升GUI编程和多用户...
在这个"Java Socket聊天和文件传输工具"中,开发者利用Socket API创建了一个实用的工具,能够实现用户间的文本聊天功能以及文件的传输。虽然源代码未提供,但我们可以根据已知的信息探讨其背后的原理和技术要点。 1...
总结来说,Java Socket聊天程序通过Java的网络编程接口实现了多用户间的点对点通讯,提供了丰富的用户界面,让用户可以方便地进行聊天交流。这样的程序设计不仅涉及网络编程,还涉及到GUI设计、多线程编程以及可能的...
本资源是本人前面发过的一个局域网聊天工具的升级版。...代码保证可用,如有问题请留言,代码较规范,结构清晰,相信对学习java socket编程和swing界面开发的朋友有一定的帮助。 注:main函数在MainFrame类
通过学习和实践这个Java Socket聊天程序,你可以深入理解网络编程的基本原理,掌握多线程编程,以及如何将这些技术应用于创建用户友好的图形界面。这不仅对提升你的Java编程技能大有裨益,而且对于理解和开发其他...
本压缩包包含的"有关socket的编程代码(简单的聊天程序)"是一个基础的Java聊天程序示例,旨在帮助初学者理解如何使用Socket进行客户端与服务器端之间的数据交互。 在Java中,Socket类代表网络上的一个端点,而...
Java聊天室程序是基于Socket编程实现的,这是一种网络通信机制,允许两台计算机通过网络交换数据。在Java中,Socket类和ServerSocket类是实现这一功能的核心组件。本程序能够支持多人在线同时聊天,这意味着它涉及到...
本篇将深入探讨Java Socket编程及其在构建聊天应用中的应用。 首先,我们要了解TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按照顺序发送,并且在接收端按顺序接收,...