socket-Socket编程初级问题,关于消息发送

问题描述

Socket编程初级问题,关于消息发送
本人刚接触java以及socket编程,入门级水平。
现已知客户端跟服务端java代码如下:

//服务端
import java.net.*; // for Socket ServerSocket and InetAddress
import java.io.*; // for IOException and Input/OutputStream

public class TCP_Server
{

private static final int BUFSIZE = 32; // Size of receive buffer

public static void main(String[] args) throws IOException
{

if (args.length != 1)  // Test for correct # of args  throw new IllegalArgumentException(""Parameter(s): <Port>"");int servPort = Integer.parseInt(args[0]);// Create a server socket to accept client connection requestsServerSocket servSock = new ServerSocket(servPort);int recvMsgSize;   // Size of received messagebyte[] byteBuffer = new byte[BUFSIZE];  // Receive bufferfor (;;) { // Run forever accepting and servicing connections  Socket clntSock = servSock.accept();     // Get client connection  System.out.println(""Handling client at "" +    clntSock.getInetAddress().getHostAddress() + "" on port "" +         clntSock.getPort());  InputStream in = clntSock.getInputStream();  OutputStream out = clntSock.getOutputStream();  // Receive until client closes connection indicated by -1 return  while ((recvMsgSize = in.read(byteBuffer)) != -1)

/*
(添加代码,企图改变字符串顺序)

*/

   out.write(byteBuffer 0 recvMsgSize);  clntSock.close();  // Close the socket.  We are done with this client!}/* NOT REACHED */

}
}

//客户端
import java.net.*; // for Socket
import java.io.*; // for IOException and Input/OutputStream

public class TCPEchoClient {

public static void main(String[] args) throws IOException {

if ((args.length < 2) || (args.length > 3))  // Test for correct # of args  throw new IllegalArgumentException(""Parameter(s): <Server> <Word> [<Port>]"");String server = args[0];       // Server name or IP address// Convert input String to bytes using the default character encodingbyte[] byteBuffer = args[1].getBytes();int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;// Create socket that is connected to server on specified portSocket socket = new Socket(server servPort);System.out.println(""Connected to server...sending echo string"");InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();out.write(byteBuffer);  // Send the encoded string to the server// Receive the same string back from the serverint totalBytesRcvd = 0;  // Total bytes received so farint bytesRcvd;           // Bytes received in last readwhile (totalBytesRcvd < byteBuffer.length) {  if ((bytesRcvd = in.read(byteBuffer totalBytesRcvd                      byteBuffer.length - totalBytesRcvd)) == -1)    throw new SocketException(""Connection close prematurely"");  totalBytesRcvd += bytesRcvd;}System.out.println(""Received: "" + new String(byteBuffer));socket.close();  // Close the socket and its streams

}
}

一般情况下,是开两个终端分别运行服务端与客户端,
先执行服务端,显示如下:
g136@ispc29Lx:~$ java TCP_Server 50000

再执行客户端,依次输入IP 字符串 port号,显示如下
g136@ispc29Lx:~$ java TCPEchoClient 150.86.64.169 ab 50000

然后客户端跟服务端都会产生反应,如下:
g136@ispc29Lx:~$ java TCP_Server 50000
Handling client at 150.86.64.169 on port 58002

g136@ispc29Lx:~$ java TCPEchoClient 150.86.64.169 ab 50000
Connected to server...sending echo string
Received: ab

输入的是ab,服务端原封不动的返回的也是ab,我希望能在服务端添加一段代码,使返回的字符顺序改变成ba;或者把ab变成大写,怎么都行,只是希望能对原字符串进行改变。
第一次提问题,还请多多包涵。

解决方案

直接贴代码吧,修改了服务端的代码,客户端没有修改。主要修改的是服务端增加一个字符串顺序逆序的方法。
你的代码很好了,没有什么问题,很棒的是全部英文,另外粘贴到Eclipse中没有警告和错误,很棒。

package com.test.jvm;//服务端import java.net.*; // for Socket ServerSocket and InetAddressimport java.io.*; // for IOException and Input/OutputStreampublic class TCP_Server {    private static final int BUFSIZE = 32; // Size of receive buffer    public static void main(String[] args) throws IOException {        if (args.length != 1) // Test for correct # of args            throw new IllegalArgumentException(""Parameter(s): <Port>"");        int servPort = Integer.parseInt(args[0]);        // Create a server socket to accept client connection requests        ServerSocket servSock = new ServerSocket(servPort);        int recvMsgSize; // Size of received message        byte[] byteBuffer = new byte[BUFSIZE]; // Receive buffer        for (;;) { // Run forever accepting and servicing connections            Socket clntSock = servSock.accept(); // Get client connection            System.out.println(""Handling client at ""                    + clntSock.getInetAddress().getHostAddress() + "" on port ""                    + clntSock.getPort());            InputStream in = clntSock.getInputStream();            OutputStream out = clntSock.getOutputStream();            // Receive until client closes connection indicated by -1 return            while ((recvMsgSize = in.read(byteBuffer)) != -1) {                /*                 * (添加代码,企图改变字符串顺序)                 */                byte[] changeOrder = changeOrder(byteBuffer recvMsgSize);                out.write(changeOrder 0 recvMsgSize);            }            clntSock.close(); // Close the socket. We are done with this client!        }        /* NOT REACHED */    }    /**     * change order for example input <code>abc</code> then output     * <code>cba</code>     *      * @param byteBuffer     *            receive bytes     * @param recvMsgSize     *            valid length of the receive bytes cannot larger than     *            byteBuffer's length.     * @return     */    private static byte[] changeOrder(byte[] byteBuffer int recvMsgSize) {        byte[] result = new byte[recvMsgSize];        for (int i = 0; i < recvMsgSize; i++) {            result[i] = byteBuffer[recvMsgSize - 1 - i];        }        return result;    }} 

解决方案二:
如果你的发送与接收功能都没有错,只能说你对字符串操作,即反转的功能实现有问题。

解决方案三:
这个你接收到字符串后,既然还原出来发送数据了,你自己想再转换,就对byte数组进行对应转换就可以了。基本就是字符数组操作

解决方案四:
试试String类的public StringBuffer reverse()方法
或者自编写代码,如下:
public static String reverse(String str){

return new StringBuilder(str).reverse().toString();

}

解决方案五:
这个消息的接收传递应该是没问题的,看看是不是字符串的处理上有什么问题

解决方案六:
首先要把你读取到的内容转换成字符串再进行字符串的其他操作就好了

解决方案七:

输入的是ab,服务端原封不动的返回的也是ab,我希望能在服务端添加一段代码,使返回的字符顺序改变成ba;或者把ab变成大写,怎么都行,只是希望能对原字符串进行改变。

服务器端接收到字符串,进行相应处理呗,通讯都调顺了,处理字符串有神马难度呢?

解决方案八:
服务器接收到数据之后的字符串处理
就是byteBuffer里面的字符

解决方案九:
首先假设楼主知道服务端代码中的那个for循环是做什么用的。

楼主的问题是如何将服务端接收的内容进行处理,倒序,大写之类的。首先应该拿到这个接收到的字符串吧。

服务端的代码是在for循环中使用输入流读取字节的方式拿到的,每都一个字节数组就写到客户端去了。楼主只要在while循环中把所有字节都收集到,转换成字符串,然后对字符串做出相应处理即可。

可以使用ByteArrayOutputStream baos = new ByteArrayOutputStream(); 来收集字节,baos.write(byteBuffer 0 recvMsgSize);

经过循环写到baos里面,写完之后,byte[] bytes = baos.toByteArray();这样就得到了服务端发过来的内容的所有字节。然后把这个字节数组转换成String message = new String(bytes); 拿到message后,你就可以做自己的处理了。

处理完后,还要把处理之后得到的字符串转成成字节数组发到客户端去。比如message经过处理之后是tempMessage,那么byte[] tempBytes = tempMessage.getBytes();就得到了字符串转成字节数组,再通过服务端的 out.write(tempBytes 0 tempBytes.length);一下写到客户端。

搞定,能解决楼主的问题吗?

解决方案十:
呃......你这个问题已经不是socket编程初级问题了而是java编程初级问题.你的socket服务端与服务端已经能正常通讯了.并且能拿到客户端发过来的字符串了.如何操作这个字符串就看你的心情了.

例如你现在可以直接在服务端写死让它返回""AB"". out.write(""AB"" 0 2); //2是AB的长度
看到了吧你服务端想返回什么东西是可以随便写的.而不是只能输出它接收到的东西.

时间: 2024-10-03 11:24:19

socket-Socket编程初级问题,关于消息发送的相关文章

数据包-在win7中使用socket UDP 编程时,数据发送不出来

问题描述 在win7中使用socket UDP 编程时,数据发送不出来 各位大哥大姐,我在使用 socket 做 UDP编程时,遇到一个非常奇怪的问题 1,在win7下使用 sendto 函数发送数据时,sendto函数的返回值正常,但是有时候没有数据发送出来(抓不到数据包),但是当拔掉网线,重插一下就有数据了,但是待会儿就又没有了(这个不是网线接触不好,因为电脑上网一直正常) 2,同样程序,在XP系统里没有问题 求高手指点,感激不尽!!!!!

socket-C#Socket编程,能实现客户端发送一个txt文件即可,怎么写?

问题描述 C#Socket编程,能实现客户端发送一个txt文件即可,怎么写? C#Socket编程,只写客户端(127.0.0.1:5555)能实现发送一个txt文件到服务器,文件目录可以直接指定,怎么写呢?大神们? 解决方案 只写客户端肯定是不行的,因为文件传输一般需要额外的信息在服务器才能完成文件的恢复:1)文件名,当然这个可以在服务端重起名.但这样就不好和客户端对应的了!2)文件在客户端传输时需要分包,所以在服务器端需要和包.3)传输过程一般为了防止数据错误,会有 CRC.等等,这些都需要

Swift中socket不定长消息发送接收的方法总结

使用 socket 可以很方便地实现客服端和服务器的长连接,并进行双向的数据通信.但有时我们发送的数据包长度并不是固定的(比如做一个聊天系统),通常的做法是在数据包前面添加个包头信息,让接收方知道整个发送包的长度.也就是说接收方先收这个固定长度的包头信息,然后再根据包头信息里面定义的实际长度来接收包数据. 下面通过一个聊天室程序演示 socket 发送/读取不定长消息包的几种方法.socket 通信这里我们使用了一个封装好的 socket 库(SwiftSocket). 几种方法 (以聊天室为例

c语言socket多线程编程限制客户端连接数

      这篇文章主要介绍了c语言socket多线程编程,可以限制客户端连接数,大家参考使用吧      先上一些多线程需要使用的函数定义:     代码如下: DWORD WINAPI ProcessClientRequests(LPVOID lpParam)  //新线程将会执行的函数定义 {       return 0; }   HANDLE handler=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, N

Java的Socket网络编程基础知识入门教程_java

一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

python之Socket网络编程详解_python

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环

DotNET(C#) Socket基本编程

编程 Socket基本编程 服务端: using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的资源. protected override void Dispose( bool disposing ) { try { socket.Close();//释放资源 mythread.Abort

Socket网络编程学习笔记(3):利用套接字助手类

在上一篇中已经介绍了利用Socket建立服务端和客户端进行通信,如果需要 的朋友可访问<Socket网络编程学习笔记(2):面向连接的Socket>.在本篇 中,将利用C#套接字的助手类来简化Socket编程,使得刚刚接触到网络编程的 朋友们更容易上手. 跟上篇一样,通过C#套接字的助手类来编程同样分 服务端和客户端. 一.服务端侦听模式 1.创建套接字与 IPEndPoint绑定,并设置为侦听模式. 1//创建IPEndPoint实例 2 IPEndPoint ipep = new IPEn

Socket 网络编程实践经验

目录 目录 相关文章 Socket 与 HTTP 的区别 生产实践考虑 网络断开重连问题 Heartbeat 心跳机制 使用非阻塞模式下的 select 函数进行 Socket 连接检查 会话过期问题 同步还是异步问题 数据缓存问题 完全断开连接问题 相关文章 NOTE:本文假设你已经对 Socket 的使用有一定的了解. Python Module_Socket_网络编程 Socket 与 HTTP 的区别 首先通过对比法来了解两者不同的特性: HTTP:超文本传输协议,首先它是一个协议,并且